Plugin Directory

Changeset 2746465


Ignore:
Timestamp:
06/22/2022 01:45:35 PM (4 years ago)
Author:
shiptimizeplugins
Message:

move plugin specific code from main file to woo-shiptimize as much as possible, grant we always consider lat lng as a float regardless of the format we receive it in

Location:
shiptimize-for-woocommerce/trunk
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • shiptimize-for-woocommerce/trunk/assets/css/shiptimize-admin.css

    r2724326 r2746465  
    1 .shiptimize-export__status{display:inline-block;margin-left:10px;margin-top:5px}.shiptimize-settings__key{min-width:350px}@font-face{font-family:shiptimize-icons;src:url(fonts/shiptimize.eot?v=2) format("embedded-opentype"),url(fonts/shiptimize.ttf?v=2) format("truetype"),url(fonts/shiptimize.woff?v=2) format("woff"),url(fonts/shiptimize.svg?v=2) format("svg");font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.shiptimize-ib,.shiptimize-icon{display:inline-block}.shiptimize-icon:before{display:inline-block;font-family:shiptimize-icons;font-size:25px}.shiptimize-icon-success:before{content:"\E905";color:#27ae60}.shiptimize-icon-not-exported:before{content:"\E906";color:#f39c12}.shiptimize-icon-error:before{content:"\E904";color:#e74c3c}.shiptimize-icon-test-successful:before{content:"\E905";color:#80e0a7}.shiptimize-icon-print-notprinted:before{content:"\E903";color:#f39c12}.shiptimize-icon-print-printed:before{content:"\E902";color:#27ae60}.shiptimize-icon-print-error:before{content:"\E901";color:#e74c3c}.shiptimize-btn-label-print{min-height:auto!important;line-height:1rem!important;padding:4px 3px 2px 4px!important}.shiptimize-btn-label-print:before{content:"\E903";font-size:20px}.shiptimize-message-large{min-width:300px}.shiptimize-list{margin-top:15px;margin-left:0}.shiptimize-tooltip__inner{display:inline-block;padding:10px 20px}.shiptimize-tooltip-wrapper{display:inline-block;text-align:center;padding:0 10px;vertical-align:top}.shiptimize-tooltip-message{display:inline-block;position:absolute;visibility:hidden;z-index:9999;background:#ececec;border:thin solid #ececec;box-shadow:0 3px 6.51px .49px rgba(0,0,0,.1);text-align:left}.shiptimize-tooltip-message__arrow{border-style:solid;position:absolute;z-index:9999;margin:-10px}.shiptimize-tooltip-message[x-placement^=left] .shiptimize-tooltip-message__arrow{border-width:10px 0 10px 10px;border-color:transparent transparent transparent #ececec;right:-10px;top:calc(50% - 10px);margin-left:0;margin-right:0}.shiptimize-status-list{margin-bottom:30px;margin-top:20px}.shiptimize-status-list li{display:inline-block;width:280px;margin-bottom:20px}.shiptimize-status-select{float:none}.shiptimize-export-btn{background-color:transparent}.shiptimize-export-btn.Shiptimize:before{font-family:shiptimize-icons;content:"\E900";background-size:100%;position:relative;left:-5px;top:0}.shiptimize-btn-print-label{background-color:transparent}.shiptimize-btn-print-label:before{font-family:shiptimize-icons;content:"\E903";background-size:100%;position:relative;left:-5px;top:0}.shiptimize-settings__section{margin:40px 0}.shiptimize-settings__field{margin-bottom:15px}.shiptimize-settings__label{display:inline-block;min-width:115px;text-align:right;margin-right:10px;vertical-align:top}.shiptimize-settings__label:after{content:":"}.shiptimize-settings__key{width:300px}.shiptimize-settings__maps_key{min-width:345px}.shiptimize-settings__checkbox-group{display:block;padding:15px 10px}.shiptimize-checkbox{display:inline-block;margin-right:20px}.shiptimize-warning{white-space:nowrap;display:block}.shiptimize__carrier-options{display:none}.shiptimize__carrier-options.active{display:inline-block}.shiptimize-errors{color:red;padding:20px 0}.shiptimize-account-btn{background-color:#f2a900}.shiptimize-loader-wrapper{display:inline-block;width:400px;min-height:200px;text-align:center;position:fixed;background-color:hsla(0,0%,100%,.8);top:50%;top:calc(50% - 150px);left:50%;left:calc(50% - 200px);z-index:99999;padding-bottom:40px;font-size:1rem}.shiptimize-loader{position:relative;width:80px;height:80px;margin:40px auto}.shiptimize-loader div{display:inline-block;position:absolute;left:8px;width:16px;background:#fdbc3b;animation:shiptimize-loader 1.2s cubic-bezier(0,.5,.5,1) infinite}.shiptimize-loader div:first-child{left:8px;animation-delay:-.24s}.shiptimize-loader div:nth-child(2){left:32px;animation-delay:-.12s}.shiptimize-loader div:nth-child(3){left:56px;animation-delay:0}@keyframes shiptimize-loader{0%{top:8px;height:64px}50%,to{top:24px;height:32px}}.shiptimize-tooltip-wrapper:hover .shiptimize-tooltip-message{visibility:visible}.column-shiptimize_status{text-align:center!important}.wbs-shiptimizeoptions{background:#f5f5f5;padding:20px;margin-bottom:20px}.wbs-shiptimize-option{margin-right:20px}.tab{display:none}.tab.active{display:block}
     1/*$orange: #ff585d;
     2$green: #80e0a7;
     3$red: #f2a900;*/
     4.shiptimize-export__status {
     5  display: inline-block;
     6  margin-left: 10px;
     7  margin-top: 5px; }
     8
     9.shiptimize-settings__key {
     10  min-width: 350px; }
     11
     12@font-face {
     13  font-family: 'shiptimize-icons';
     14  src: url("./fonts/shiptimize.eot?v=2") format("embedded-opentype"), url("./fonts/shiptimize.ttf?v=2") format("truetype"), url("./fonts/shiptimize.woff?v=2") format("woff"), url("./fonts/shiptimize.svg?v=2") format("svg");
     15  font-style: normal;
     16  font-weight: normal;
     17  font-variant: normal;
     18  text-transform: none;
     19  line-height: 1;
     20  -webkit-font-smoothing: antialiased; }
     21
     22.shiptimize-ib {
     23  display: inline-block; }
     24
     25.shiptimize-icon {
     26  display: inline-block; }
     27  .shiptimize-icon::before {
     28    display: inline-block;
     29    font-family: shiptimize-icons;
     30    font-size: 25px; }
     31  .shiptimize-icon-success::before {
     32    content: "\E905";
     33    color: #27ae60; }
     34  .shiptimize-icon-not-exported::before {
     35    content: "\E906";
     36    color: #f39c12; }
     37  .shiptimize-icon-error::before {
     38    content: "\E904";
     39    color: #e74c3c; }
     40  .shiptimize-icon-test-successful::before {
     41    content: "\E905";
     42    color: #80e0a7; }
     43  .shiptimize-icon-print-notprinted::before {
     44    content: "\E903";
     45    color: #f39c12; }
     46  .shiptimize-icon-print-printed::before {
     47    content: "\E902";
     48    color: #27ae60; }
     49  .shiptimize-icon-print-error::before {
     50    content: "\E901";
     51    color: #e74c3c; }
     52
     53.shiptimize-btn-label-print {
     54  min-height: auto !important;
     55  line-height: 1rem !important;
     56  padding: 4px 3px 2px 4px !important; }
     57  .shiptimize-btn-label-print::before {
     58    content: "\E903";
     59    font-size: 20px; }
     60
     61.shiptimize-message-large {
     62  min-width: 300px; }
     63
     64.shiptimize-list {
     65  margin-top: 15px;
     66  margin-left: 0; }
     67
     68.shiptimize-tooltip__inner {
     69  display: inline-block;
     70  padding: 10px 20px; }
     71
     72.shiptimize-tooltip-wrapper {
     73  display: inline-block;
     74  text-align: center;
     75  padding: 0 10px;
     76  vertical-align: top; }
     77
     78.shiptimize-tooltip-message {
     79  display: inline-block;
     80  position: absolute;
     81  visibility: hidden;
     82  /** display none f* up the position calculation */
     83  z-index: 9999;
     84  background: #ececec;
     85  border: solid thin #ececec;
     86  box-shadow: 0px 3px 6.51px 0.49px rgba(0, 0, 0, 0.1);
     87  text-align: left; }
     88  .shiptimize-tooltip-message__arrow {
     89    border-style: solid;
     90    position: absolute;
     91    z-index: 9999;
     92    margin: -10px; }
     93  .shiptimize-tooltip-message[x-placement^="left"] .shiptimize-tooltip-message__arrow {
     94    border-width: 10px 0 10px 10px;
     95    border-color: transparent transparent transparent #ececec;
     96    right: -10px;
     97    top: calc(50% - 10px);
     98    margin-left: 0;
     99    margin-right: 0; }
     100
     101.shiptimize-status-list {
     102  margin-bottom: 30px;
     103  margin-top: 20px; }
     104  .shiptimize-status-list li {
     105    display: inline-block;
     106    width: 280px;
     107    margin-bottom: 20px; }
     108
     109.shiptimize-status-select {
     110  float: none; }
     111
     112.shiptimize-export-btn {
     113  background-color: transparent; }
     114  .shiptimize-export-btn.Shiptimize::before {
     115    font-family: 'shiptimize-icons';
     116    content: '\E900';
     117    background-size: 100%;
     118    position: relative;
     119    left: -5px;
     120    top: 0px; }
     121
     122.shiptimize-btn-print-label {
     123  background-color: transparent; }
     124  .shiptimize-btn-print-label::before {
     125    font-family: 'shiptimize-icons';
     126    content: '\E903';
     127    background-size: 100%;
     128    position: relative;
     129    left: -5px;
     130    top: 0px; }
     131
     132.shiptimize-settings__section {
     133  margin: 40px 0; }
     134
     135.shiptimize-settings__field {
     136  margin-bottom: 15px; }
     137
     138.shiptimize-settings__label {
     139  display: inline-block;
     140  min-width: 115px;
     141  text-align: right;
     142  margin-right: 10px;
     143  vertical-align: top; }
     144  .shiptimize-settings__label::after {
     145    content: ':'; }
     146
     147.shiptimize-settings__key {
     148  width: 300px; }
     149
     150.shiptimize-settings__maps_key {
     151  min-width: 345px; }
     152
     153.shiptimize-settings__checkbox-group {
     154  display: block;
     155  padding: 15px 10px; }
     156
     157.shiptimize-checkbox {
     158  display: inline-block;
     159  margin-right: 20px; }
     160
     161.shiptimize-warning {
     162  white-space: nowrap;
     163  display: block; }
     164
     165.shiptimize__carrier-options {
     166  display: none; }
     167  .shiptimize__carrier-options.active {
     168    display: inline-block; }
     169
     170.shiptimize-errors {
     171  color: red;
     172  padding: 20px 0; }
     173
     174.shiptimize-account-btn {
     175  background-color: #f2a900; }
     176
     177.shiptimize-loader-wrapper {
     178  display: inline-block;
     179  width: 400px;
     180  min-height: 200px;
     181  text-align: center;
     182  position: fixed;
     183  background-color: rgba(255, 255, 255, 0.8);
     184  top: 50%;
     185  top: calc(50% - 150px);
     186  left: 50%;
     187  left: calc(50% - 200px);
     188  z-index: 99999;
     189  padding-bottom: 40px;
     190  font-size: 1rem; }
     191
     192.shiptimize-loader {
     193  position: relative;
     194  width: 80px;
     195  height: 80px;
     196  margin: 40px auto; }
     197
     198.shiptimize-loader div {
     199  display: inline-block;
     200  position: absolute;
     201  left: 8px;
     202  width: 16px;
     203  background: #fdbc3b;
     204  animation: shiptimize-loader 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; }
     205
     206.shiptimize-loader div:nth-child(1) {
     207  left: 8px;
     208  animation-delay: -0.24s; }
     209
     210.shiptimize-loader div:nth-child(2) {
     211  left: 32px;
     212  animation-delay: -0.12s; }
     213
     214.shiptimize-loader div:nth-child(3) {
     215  left: 56px;
     216  animation-delay: 0; }
     217
     218@keyframes shiptimize-loader {
     219  0% {
     220    top: 8px;
     221    height: 64px; }
     222  50%, 100% {
     223    top: 24px;
     224    height: 32px; } }
     225
     226.shiptimize-tooltip-wrapper:hover .shiptimize-tooltip-message {
     227  visibility: visible; }
     228
     229.column-shiptimize_status {
     230  text-align: center !important; }
     231
     232.wbs-shiptimizeoptions {
     233  background: whitesmoke;
     234  padding: 20px;
     235  margin-bottom: 20px; }
     236
     237.wbs-shiptimize-option {
     238  margin-right: 20px; }
     239
     240.tab {
     241  display: none; }
     242  .tab.active {
     243    display: block; }
     244
  • shiptimize-for-woocommerce/trunk/assets/css/shiptimize.css

    r2724326 r2746465  
    1 .shiptimize-shipping-options,.shiptimize-shipping-options td{border:0}.shiptimize-marketplace-settings{padding:20px}.shiptimize-connect{padding:.6180469716em 1.41575em;color:#fff;background-color:#ffa300;display:inline-block}.shiptimize-pickup{display:none}.shiptimize-pickup.active{display:block}.shiptimize-pickup__overlay{position:fixed;height:100%;width:100%;z-index:9999;background:hsla(0,0%,100%,.9);top:0;left:0}.shiptimize-pickup__mapWrapper{z-index:99991;position:absolute;top:18%;left:7%;width:86%;min-height:50%;min-height:50vh;display:flex}.shiptimize-pickup__map-loader{width:62%;height:100%;display:none;z-index:99999;opacity:.9;margin:auto}.shiptimize-pickup__mapWrapper.loading{align-items:center}.shiptimize-pickup__mapWrapper.loading #shiptimizeMap,.shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options{display:none}.shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__map-loader{display:inline-block}.shiptimize-pickup__map{position:absolute;right:0;top:0;display:inline-block;width:62%;height:100%;vertical-align:top}.shiptimize-pickup__title{font-size:2em;margin-bottom:1em}.shiptimize-pickup__options{display:inline-block;width:38%;min-height:100%;vertical-align:top;background:#f7f7f7;padding:20px 40px}.shiptimize-pickup__point{margin-bottom:2px;font-size:12px}.shiptimize-pickup__point input[type=radio]{width:auto!important;margin-top:0!important}.shiptimize-pickup__error{padding:40px 61px;position:fixed;background-color:#fff;color:#000;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);z-index:9999;box-shadow:0 3px 6.51px .49px rgba(0,0,0,.1);font-size:25px;line-height:1.5em;display:none}.shiptimize-pickup__extended{margin-top:5px}.shiptimize-pickup__extended_label{margin-right:5px}.shiptimize-pickup__close{position:fixed;top:8%;left:88%;z-index:9999}.shiptimize-pickup__close:after{display:inline-block;content:"X";font-size:40px;font-weight:300;color:#9c9c9c;cursor:pointer}.shiptimize-pickup__validate{width:90%;margin-top:20px;text-align:center}.shiptimize-pickup__point_description{display:inline-block;margin-left:10px;vertical-align:top;max-width:calc(100% - 30px);cursor:pointer}.shiptimize-pickup__description{display:block;margin-top:20px;font-weight:600}.shiptimize-btn{background-color:#ffa300;color:#fff;border-radius:5px;line-height:1.3em;vertical-align:top}.shiptimize-wcfm-checkbox{margin-right:0!important}.shiptimize-request-account label{width:105px;text-align:right;margin-right:10px;display:inline-block}.shiptimize-request-account input[type=text]{width:500px}.shiptimize-request-account .form-item{margin-bottom:5px;display:flex;flex-direction:row}.shiptimize-loader{position:relative;width:80px;height:80px;z-index:99999;top:50%;top:calc(50% - 40px);left:50%;left:calc(50% - 40px)}.shiptimize-loader div{display:inline-block;position:absolute;left:8px;width:16px;background:#fdbc3b;animation:shiptimize-loader 1.2s cubic-bezier(0,.5,.5,1) infinite}.shiptimize-loader div:first-child{left:8px;animation-delay:-.24s}.shiptimize-loader div:nth-child(2){left:32px;animation-delay:-.12s}.shiptimize-loader div:nth-child(3){left:56px;animation-delay:0}@keyframes shiptimize-loader{0%{top:8px;height:64px}50%,to{top:24px;height:32px}}@media (max-width:1024px){.shiptimize-choose-pickup{width:100%;text-align:center}}@media (max-width:768px){.shiptimize-pickup__mapWrapper{display:inline-block;top:10%;left:5%;width:90%;min-height:0}.shiptimize-pickup__options{position:absolute;top:100%;top:45vh;width:100%;min-height:50%}.shiptimize-pickup__map{width:100%;height:45%;height:45vh}.shiptimize-pickup__close{top:2%;top:2vh}.shiptimize-pickup__error{padding:40px 20px;width:90%;left:5%;top:50%;font-size:16px;transform:translateY(-50%)}}.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform;-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:hsla(0,0%,100%,.5)}.leaflet-container{font:12px/1.5 Helvetica Neue,Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(images/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers-expanded .leaflet-control-layers-toggle,.leaflet-control-layers .leaflet-control-layers-list{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:hsla(0,0%,100%,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:hsla(0,0%,100%,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}
     1.shiptimize-shipping-options {
     2  border: 0; }
     3  .shiptimize-shipping-options td {
     4    border: 0; }
     5
     6.shiptimize-marketplace-settings {
     7  padding: 20px; }
     8
     9.shiptimize-connect {
     10  padding: 0.6180469716em 1.41575em;
     11  color: white;
     12  background-color: #FFA300;
     13  display: inline-block; }
     14
     15.shiptimize-pickup {
     16  display: none;
     17  /*** **/
     18  /** Points loading .. */
     19  /**
     20         * It's absolute because The map won't display
     21         * with min-height instead of height and we want to make
     22         * sure that all points are visible
     23         * so the container must be able to grow taller
     24         */ }
     25  .shiptimize-pickup.active {
     26    display: block; }
     27  .shiptimize-pickup__overlay {
     28    position: fixed;
     29    height: 100%;
     30    width: 100%;
     31    z-index: 9999;
     32    background: rgba(255, 255, 255, 0.9);
     33    top: 0;
     34    left: 0; }
     35  .shiptimize-pickup__mapWrapper {
     36    z-index: 99991;
     37    position: absolute;
     38    top: 18%;
     39    left: 7%;
     40    width: 86%;
     41    min-height: 50%;
     42    min-height: 50vh;
     43    display: flex; }
     44  .shiptimize-pickup__map-loader {
     45    width: 62%;
     46    height: 100%;
     47    display: none;
     48    z-index: 99999;
     49    opacity: 0.9;
     50    margin: auto; }
     51  .shiptimize-pickup__mapWrapper.loading {
     52    align-items: center; }
     53  .shiptimize-pickup__mapWrapper.loading #shiptimizeMap,
     54  .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options,
     55  .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options {
     56    display: none; }
     57  .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__map-loader {
     58    display: inline-block; }
     59  .shiptimize-pickup__map {
     60    position: absolute;
     61    right: 0;
     62    top: 0;
     63    display: inline-block;
     64    width: 62%;
     65    height: 100%;
     66    vertical-align: top; }
     67  .shiptimize-pickup__title {
     68    font-size: 2em;
     69    margin-bottom: 1em; }
     70  .shiptimize-pickup__options {
     71    display: inline-block;
     72    width: 38%;
     73    min-height: 100%;
     74    vertical-align: top;
     75    background: #f7f7f7;
     76    padding: 20px 40px; }
     77  .shiptimize-pickup__point {
     78    margin-bottom: 2px;
     79    font-size: 12px;
     80    /** because of barsonsight.nl **/ }
     81    .shiptimize-pickup__point input[type='radio'] {
     82      width: auto !important;
     83      margin-top: 0 !important; }
     84  .shiptimize-pickup__error {
     85    padding: 40px 61px;
     86    position: fixed;
     87    background-color: #fff;
     88    color: #000000;
     89    top: 50%;
     90    left: 50%;
     91    transform: translateX(-50%) translateY(-50%);
     92    z-index: 9999;
     93    box-shadow: 0px 3px 6.51px 0.49px rgba(0, 0, 0, 0.1);
     94    font-size: 25px;
     95    line-height: 1.5em;
     96    display: none; }
     97  .shiptimize-pickup__extended {
     98    margin-top: 5px; }
     99  .shiptimize-pickup__extended_label {
     100    margin-right: 5px; }
     101  .shiptimize-pickup__close {
     102    position: fixed;
     103    top: 8%;
     104    left: 88%;
     105    z-index: 9999; }
     106    .shiptimize-pickup__close::after {
     107      display: inline-block;
     108      content: 'X';
     109      font-size: 40px;
     110      font-weight: 300;
     111      color: #9c9c9c;
     112      cursor: pointer; }
     113  .shiptimize-pickup__validate {
     114    width: 90%;
     115    margin-top: 20px;
     116    text-align: center; }
     117  .shiptimize-pickup__point_description {
     118    display: inline-block;
     119    margin-left: 10px;
     120    vertical-align: top;
     121    max-width: calc(100% - 30px);
     122    cursor: pointer; }
     123  .shiptimize-pickup__description {
     124    display: block;
     125    margin-top: 20px;
     126    font-weight: 600; }
     127
     128.shiptimize-btn {
     129  background-color: #FFA300;
     130  color: white;
     131  border-radius: 5px;
     132  line-height: 1.3em;
     133  vertical-align: top; }
     134
     135.shiptimize-wcfm-checkbox {
     136  margin-right: 0 !important; }
     137
     138.shiptimize-request-account label {
     139  width: 105px;
     140  text-align: right;
     141  margin-right: 10px;
     142  display: inline-block; }
     143
     144.shiptimize-request-account input[type='text'] {
     145  width: 500px; }
     146
     147.shiptimize-request-account .form-item {
     148  margin-bottom: 5px;
     149  display: flex;
     150  flex-direction: row; }
     151
     152.shiptimize-loader {
     153  position: relative;
     154  width: 80px;
     155  height: 80px;
     156  z-index: 99999;
     157  top: 50%;
     158  top: calc(50% - 40px);
     159  left: 50%;
     160  left: calc(50% - 40px); }
     161
     162.shiptimize-loader div {
     163  display: inline-block;
     164  position: absolute;
     165  left: 8px;
     166  width: 16px;
     167  background: #fdbc3b;
     168  animation: shiptimize-loader 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; }
     169
     170.shiptimize-loader div:nth-child(1) {
     171  left: 8px;
     172  animation-delay: -0.24s; }
     173
     174.shiptimize-loader div:nth-child(2) {
     175  left: 32px;
     176  animation-delay: -0.12s; }
     177
     178.shiptimize-loader div:nth-child(3) {
     179  left: 56px;
     180  animation-delay: 0; }
     181
     182@keyframes shiptimize-loader {
     183  0% {
     184    top: 8px;
     185    height: 64px; }
     186  50%, 100% {
     187    top: 24px;
     188    height: 32px; } }
     189
     190@media (max-width: 1024px) {
     191  .shiptimize-choose-pickup {
     192    width: 100%;
     193    text-align: center; } }
     194
     195@media (max-width: 768px) {
     196  .shiptimize-pickup__mapWrapper {
     197    display: inline-block;
     198    top: 10%;
     199    left: 5%;
     200    width: 90%;
     201    min-height: 0; }
     202  .shiptimize-pickup__options {
     203    position: absolute;
     204    top: 100%;
     205    top: 45vh;
     206    width: 100%;
     207    min-height: 50%; }
     208  .shiptimize-pickup__map {
     209    width: 100%;
     210    height: 45%;
     211    height: 45vh; }
     212  .shiptimize-pickup__close {
     213    top: 2%;
     214    top: 2vh; }
     215  .shiptimize-pickup__error {
     216    padding: 40px 20px;
     217    width: 90%;
     218    left: 5%;
     219    top: 50%;
     220    font-size: 16px;
     221    transform: translateY(-50%); } }
     222
     223/* required styles */
     224.leaflet-pane,
     225.leaflet-tile,
     226.leaflet-marker-icon,
     227.leaflet-marker-shadow,
     228.leaflet-tile-container,
     229.leaflet-pane > svg,
     230.leaflet-pane > canvas,
     231.leaflet-zoom-box,
     232.leaflet-image-layer,
     233.leaflet-layer {
     234  position: absolute;
     235  left: 0;
     236  top: 0; }
     237
     238.leaflet-container {
     239  overflow: hidden; }
     240
     241.leaflet-tile,
     242.leaflet-marker-icon,
     243.leaflet-marker-shadow {
     244  -webkit-user-select: none;
     245  -moz-user-select: none;
     246  user-select: none;
     247  -webkit-user-drag: none; }
     248
     249/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
     250.leaflet-safari .leaflet-tile {
     251  image-rendering: -webkit-optimize-contrast; }
     252
     253/* hack that prevents hw layers "stretching" when loading new tiles */
     254.leaflet-safari .leaflet-tile-container {
     255  width: 1600px;
     256  height: 1600px;
     257  -webkit-transform-origin: 0 0; }
     258
     259.leaflet-marker-icon,
     260.leaflet-marker-shadow {
     261  display: block; }
     262
     263/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
     264/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
     265.leaflet-container .leaflet-overlay-pane svg,
     266.leaflet-container .leaflet-marker-pane img,
     267.leaflet-container .leaflet-shadow-pane img,
     268.leaflet-container .leaflet-tile-pane img,
     269.leaflet-container img.leaflet-image-layer,
     270.leaflet-container .leaflet-tile {
     271  max-width: none !important;
     272  max-height: none !important; }
     273
     274.leaflet-container.leaflet-touch-zoom {
     275  -ms-touch-action: pan-x pan-y;
     276  touch-action: pan-x pan-y; }
     277
     278.leaflet-container.leaflet-touch-drag {
     279  -ms-touch-action: pinch-zoom;
     280  /* Fallback for FF which doesn't support pinch-zoom */
     281  touch-action: none;
     282  touch-action: pinch-zoom; }
     283
     284.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
     285  -ms-touch-action: none;
     286  touch-action: none; }
     287
     288.leaflet-container {
     289  -webkit-tap-highlight-color: transparent; }
     290
     291.leaflet-container a {
     292  -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); }
     293
     294.leaflet-tile {
     295  filter: inherit;
     296  visibility: hidden; }
     297
     298.leaflet-tile-loaded {
     299  visibility: inherit; }
     300
     301.leaflet-zoom-box {
     302  width: 0;
     303  height: 0;
     304  -moz-box-sizing: border-box;
     305  box-sizing: border-box;
     306  z-index: 800; }
     307
     308/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
     309.leaflet-overlay-pane svg {
     310  -moz-user-select: none; }
     311
     312.leaflet-pane {
     313  z-index: 400; }
     314
     315.leaflet-tile-pane {
     316  z-index: 200; }
     317
     318.leaflet-overlay-pane {
     319  z-index: 400; }
     320
     321.leaflet-shadow-pane {
     322  z-index: 500; }
     323
     324.leaflet-marker-pane {
     325  z-index: 600; }
     326
     327.leaflet-tooltip-pane {
     328  z-index: 650; }
     329
     330.leaflet-popup-pane {
     331  z-index: 700; }
     332
     333.leaflet-map-pane canvas {
     334  z-index: 100; }
     335
     336.leaflet-map-pane svg {
     337  z-index: 200; }
     338
     339.leaflet-vml-shape {
     340  width: 1px;
     341  height: 1px; }
     342
     343.lvml {
     344  behavior: url(#default#VML);
     345  display: inline-block;
     346  position: absolute; }
     347
     348/* control positioning */
     349.leaflet-control {
     350  position: relative;
     351  z-index: 800;
     352  pointer-events: visiblePainted;
     353  /* IE 9-10 doesn't have auto */
     354  pointer-events: auto; }
     355
     356.leaflet-top,
     357.leaflet-bottom {
     358  position: absolute;
     359  z-index: 1000;
     360  pointer-events: none; }
     361
     362.leaflet-top {
     363  top: 0; }
     364
     365.leaflet-right {
     366  right: 0; }
     367
     368.leaflet-bottom {
     369  bottom: 0; }
     370
     371.leaflet-left {
     372  left: 0; }
     373
     374.leaflet-control {
     375  float: left;
     376  clear: both; }
     377
     378.leaflet-right .leaflet-control {
     379  float: right; }
     380
     381.leaflet-top .leaflet-control {
     382  margin-top: 10px; }
     383
     384.leaflet-bottom .leaflet-control {
     385  margin-bottom: 10px; }
     386
     387.leaflet-left .leaflet-control {
     388  margin-left: 10px; }
     389
     390.leaflet-right .leaflet-control {
     391  margin-right: 10px; }
     392
     393/* zoom and fade animations */
     394.leaflet-fade-anim .leaflet-tile {
     395  will-change: opacity; }
     396
     397.leaflet-fade-anim .leaflet-popup {
     398  opacity: 0;
     399  -webkit-transition: opacity 0.2s linear;
     400  -moz-transition: opacity 0.2s linear;
     401  transition: opacity 0.2s linear; }
     402
     403.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
     404  opacity: 1; }
     405
     406.leaflet-zoom-animated {
     407  -webkit-transform-origin: 0 0;
     408  -ms-transform-origin: 0 0;
     409  transform-origin: 0 0; }
     410
     411.leaflet-zoom-anim .leaflet-zoom-animated {
     412  will-change: transform; }
     413
     414.leaflet-zoom-anim .leaflet-zoom-animated {
     415  -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1);
     416  -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1);
     417  transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1); }
     418
     419.leaflet-zoom-anim .leaflet-tile,
     420.leaflet-pan-anim .leaflet-tile {
     421  -webkit-transition: none;
     422  -moz-transition: none;
     423  transition: none; }
     424
     425.leaflet-zoom-anim .leaflet-zoom-hide {
     426  visibility: hidden; }
     427
     428/* cursors */
     429.leaflet-interactive {
     430  cursor: pointer; }
     431
     432.leaflet-grab {
     433  cursor: -webkit-grab;
     434  cursor: -moz-grab;
     435  cursor: grab; }
     436
     437.leaflet-crosshair,
     438.leaflet-crosshair .leaflet-interactive {
     439  cursor: crosshair; }
     440
     441.leaflet-popup-pane,
     442.leaflet-control {
     443  cursor: auto; }
     444
     445.leaflet-dragging .leaflet-grab,
     446.leaflet-dragging .leaflet-grab .leaflet-interactive,
     447.leaflet-dragging .leaflet-marker-draggable {
     448  cursor: move;
     449  cursor: -webkit-grabbing;
     450  cursor: -moz-grabbing;
     451  cursor: grabbing; }
     452
     453/* marker & overlays interactivity */
     454.leaflet-marker-icon,
     455.leaflet-marker-shadow,
     456.leaflet-image-layer,
     457.leaflet-pane > svg path,
     458.leaflet-tile-container {
     459  pointer-events: none; }
     460
     461.leaflet-marker-icon.leaflet-interactive,
     462.leaflet-image-layer.leaflet-interactive,
     463.leaflet-pane > svg path.leaflet-interactive {
     464  pointer-events: visiblePainted;
     465  /* IE 9-10 doesn't have auto */
     466  pointer-events: auto; }
     467
     468/* visual tweaks */
     469.leaflet-container {
     470  background: #ddd;
     471  outline: 0; }
     472
     473.leaflet-container a {
     474  color: #0078A8; }
     475
     476.leaflet-container a.leaflet-active {
     477  outline: 2px solid orange; }
     478
     479.leaflet-zoom-box {
     480  border: 2px dotted #38f;
     481  background: rgba(255, 255, 255, 0.5); }
     482
     483/* general typography */
     484.leaflet-container {
     485  font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; }
     486
     487/* general toolbar styles */
     488.leaflet-bar {
     489  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);
     490  border-radius: 4px; }
     491
     492.leaflet-bar a,
     493.leaflet-bar a:hover {
     494  background-color: #fff;
     495  border-bottom: 1px solid #ccc;
     496  width: 26px;
     497  height: 26px;
     498  line-height: 26px;
     499  display: block;
     500  text-align: center;
     501  text-decoration: none;
     502  color: black; }
     503
     504.leaflet-bar a,
     505.leaflet-control-layers-toggle {
     506  background-position: 50% 50%;
     507  background-repeat: no-repeat;
     508  display: block; }
     509
     510.leaflet-bar a:hover {
     511  background-color: #f4f4f4; }
     512
     513.leaflet-bar a:first-child {
     514  border-top-left-radius: 4px;
     515  border-top-right-radius: 4px; }
     516
     517.leaflet-bar a:last-child {
     518  border-bottom-left-radius: 4px;
     519  border-bottom-right-radius: 4px;
     520  border-bottom: none; }
     521
     522.leaflet-bar a.leaflet-disabled {
     523  cursor: default;
     524  background-color: #f4f4f4;
     525  color: #bbb; }
     526
     527.leaflet-touch .leaflet-bar a {
     528  width: 30px;
     529  height: 30px;
     530  line-height: 30px; }
     531
     532.leaflet-touch .leaflet-bar a:first-child {
     533  border-top-left-radius: 2px;
     534  border-top-right-radius: 2px; }
     535
     536.leaflet-touch .leaflet-bar a:last-child {
     537  border-bottom-left-radius: 2px;
     538  border-bottom-right-radius: 2px; }
     539
     540/* zoom control */
     541.leaflet-control-zoom-in,
     542.leaflet-control-zoom-out {
     543  font: bold 18px 'Lucida Console', Monaco, monospace;
     544  text-indent: 1px; }
     545
     546.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
     547  font-size: 22px; }
     548
     549/* layers control */
     550.leaflet-control-layers {
     551  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);
     552  background: #fff;
     553  border-radius: 5px; }
     554
     555.leaflet-control-layers-toggle {
     556  background-image: url(images/layers.png);
     557  width: 36px;
     558  height: 36px; }
     559
     560.leaflet-retina .leaflet-control-layers-toggle {
     561  background-image: url(images/layers-2x.png);
     562  background-size: 26px 26px; }
     563
     564.leaflet-touch .leaflet-control-layers-toggle {
     565  width: 44px;
     566  height: 44px; }
     567
     568.leaflet-control-layers .leaflet-control-layers-list,
     569.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
     570  display: none; }
     571
     572.leaflet-control-layers-expanded .leaflet-control-layers-list {
     573  display: block;
     574  position: relative; }
     575
     576.leaflet-control-layers-expanded {
     577  padding: 6px 10px 6px 6px;
     578  color: #333;
     579  background: #fff; }
     580
     581.leaflet-control-layers-scrollbar {
     582  overflow-y: scroll;
     583  overflow-x: hidden;
     584  padding-right: 5px; }
     585
     586.leaflet-control-layers-selector {
     587  margin-top: 2px;
     588  position: relative;
     589  top: 1px; }
     590
     591.leaflet-control-layers label {
     592  display: block; }
     593
     594.leaflet-control-layers-separator {
     595  height: 0;
     596  border-top: 1px solid #ddd;
     597  margin: 5px -10px 5px -6px; }
     598
     599/* Default icon URLs */
     600.leaflet-default-icon-path {
     601  background-image: url(images/marker-icon.png); }
     602
     603/* attribution and scale controls */
     604.leaflet-container .leaflet-control-attribution {
     605  background: #fff;
     606  background: rgba(255, 255, 255, 0.7);
     607  margin: 0; }
     608
     609.leaflet-control-attribution,
     610.leaflet-control-scale-line {
     611  padding: 0 5px;
     612  color: #333; }
     613
     614.leaflet-control-attribution a {
     615  text-decoration: none; }
     616
     617.leaflet-control-attribution a:hover {
     618  text-decoration: underline; }
     619
     620.leaflet-container .leaflet-control-attribution,
     621.leaflet-container .leaflet-control-scale {
     622  font-size: 11px; }
     623
     624.leaflet-left .leaflet-control-scale {
     625  margin-left: 5px; }
     626
     627.leaflet-bottom .leaflet-control-scale {
     628  margin-bottom: 5px; }
     629
     630.leaflet-control-scale-line {
     631  border: 2px solid #777;
     632  border-top: none;
     633  line-height: 1.1;
     634  padding: 2px 5px 1px;
     635  font-size: 11px;
     636  white-space: nowrap;
     637  overflow: hidden;
     638  -moz-box-sizing: border-box;
     639  box-sizing: border-box;
     640  background: #fff;
     641  background: rgba(255, 255, 255, 0.5); }
     642
     643.leaflet-control-scale-line:not(:first-child) {
     644  border-top: 2px solid #777;
     645  border-bottom: none;
     646  margin-top: -2px; }
     647
     648.leaflet-control-scale-line:not(:first-child):not(:last-child) {
     649  border-bottom: 2px solid #777; }
     650
     651.leaflet-touch .leaflet-control-attribution,
     652.leaflet-touch .leaflet-control-layers,
     653.leaflet-touch .leaflet-bar {
     654  box-shadow: none; }
     655
     656.leaflet-touch .leaflet-control-layers,
     657.leaflet-touch .leaflet-bar {
     658  border: 2px solid rgba(0, 0, 0, 0.2);
     659  background-clip: padding-box; }
     660
     661/* popup */
     662.leaflet-popup {
     663  position: absolute;
     664  text-align: center;
     665  margin-bottom: 20px; }
     666
     667.leaflet-popup-content-wrapper {
     668  padding: 1px;
     669  text-align: left;
     670  border-radius: 12px; }
     671
     672.leaflet-popup-content {
     673  margin: 13px 19px;
     674  line-height: 1.4; }
     675
     676.leaflet-popup-content p {
     677  margin: 18px 0; }
     678
     679.leaflet-popup-tip-container {
     680  width: 40px;
     681  height: 20px;
     682  position: absolute;
     683  left: 50%;
     684  margin-left: -20px;
     685  overflow: hidden;
     686  pointer-events: none; }
     687
     688.leaflet-popup-tip {
     689  width: 17px;
     690  height: 17px;
     691  padding: 1px;
     692  margin: -10px auto 0;
     693  -webkit-transform: rotate(45deg);
     694  -moz-transform: rotate(45deg);
     695  -ms-transform: rotate(45deg);
     696  transform: rotate(45deg); }
     697
     698.leaflet-popup-content-wrapper,
     699.leaflet-popup-tip {
     700  background: white;
     701  color: #333;
     702  box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4); }
     703
     704.leaflet-container a.leaflet-popup-close-button {
     705  position: absolute;
     706  top: 0;
     707  right: 0;
     708  padding: 4px 4px 0 0;
     709  border: none;
     710  text-align: center;
     711  width: 18px;
     712  height: 14px;
     713  font: 16px/14px Tahoma, Verdana, sans-serif;
     714  color: #c3c3c3;
     715  text-decoration: none;
     716  font-weight: bold;
     717  background: transparent; }
     718
     719.leaflet-container a.leaflet-popup-close-button:hover {
     720  color: #999; }
     721
     722.leaflet-popup-scrolled {
     723  overflow: auto;
     724  border-bottom: 1px solid #ddd;
     725  border-top: 1px solid #ddd; }
     726
     727.leaflet-oldie .leaflet-popup-content-wrapper {
     728  zoom: 1; }
     729
     730.leaflet-oldie .leaflet-popup-tip {
     731  width: 24px;
     732  margin: 0 auto;
     733  -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
     734  filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); }
     735
     736.leaflet-oldie .leaflet-popup-tip-container {
     737  margin-top: -1px; }
     738
     739.leaflet-oldie .leaflet-control-zoom,
     740.leaflet-oldie .leaflet-control-layers,
     741.leaflet-oldie .leaflet-popup-content-wrapper,
     742.leaflet-oldie .leaflet-popup-tip {
     743  border: 1px solid #999; }
     744
     745/* div icon */
     746.leaflet-div-icon {
     747  background: #fff;
     748  border: 1px solid #666; }
     749
     750/* Tooltip */
     751/* Base styles for the element that has a tooltip */
     752.leaflet-tooltip {
     753  position: absolute;
     754  padding: 6px;
     755  background-color: #fff;
     756  border: 1px solid #fff;
     757  border-radius: 3px;
     758  color: #222;
     759  white-space: nowrap;
     760  -webkit-user-select: none;
     761  -moz-user-select: none;
     762  -ms-user-select: none;
     763  user-select: none;
     764  pointer-events: none;
     765  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }
     766
     767.leaflet-tooltip.leaflet-clickable {
     768  cursor: pointer;
     769  pointer-events: auto; }
     770
     771.leaflet-tooltip-top:before,
     772.leaflet-tooltip-bottom:before,
     773.leaflet-tooltip-left:before,
     774.leaflet-tooltip-right:before {
     775  position: absolute;
     776  pointer-events: none;
     777  border: 6px solid transparent;
     778  background: transparent;
     779  content: ""; }
     780
     781/* Directions */
     782.leaflet-tooltip-bottom {
     783  margin-top: 6px; }
     784
     785.leaflet-tooltip-top {
     786  margin-top: -6px; }
     787
     788.leaflet-tooltip-bottom:before,
     789.leaflet-tooltip-top:before {
     790  left: 50%;
     791  margin-left: -6px; }
     792
     793.leaflet-tooltip-top:before {
     794  bottom: 0;
     795  margin-bottom: -12px;
     796  border-top-color: #fff; }
     797
     798.leaflet-tooltip-bottom:before {
     799  top: 0;
     800  margin-top: -12px;
     801  margin-left: -6px;
     802  border-bottom-color: #fff; }
     803
     804.leaflet-tooltip-left {
     805  margin-left: -6px; }
     806
     807.leaflet-tooltip-right {
     808  margin-left: 6px; }
     809
     810.leaflet-tooltip-left:before,
     811.leaflet-tooltip-right:before {
     812  top: 50%;
     813  margin-top: -6px; }
     814
     815.leaflet-tooltip-left:before {
     816  right: 0;
     817  margin-right: -12px;
     818  border-left-color: #fff; }
     819
     820.leaflet-tooltip-right:before {
     821  left: 0;
     822  margin-left: -12px;
     823  border-right-color: #fff; }
     824
  • shiptimize-for-woocommerce/trunk/assets/js/shiptimize-admin.js

    r2724326 r2746465  
    1 !function(e){var n={};function F(B){if(n[B])return n[B].exports;var Q=n[B]={i:B,l:!1,exports:{}};return e[B].call(Q.exports,Q,Q.exports,F),Q.l=!0,Q.exports}F.m=e,F.c=n,F.d=function(B,Q,e){F.o(B,Q)||Object.defineProperty(B,Q,{enumerable:!0,get:e})},F.r=function(B){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(B,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(B,"__esModule",{value:!0})},F.t=function(Q,B){if(1&B&&(Q=F(Q)),8&B)return Q;if(4&B&&"object"==typeof Q&&Q&&Q.__esModule)return Q;var e=Object.create(null);if(F.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:Q}),2&B&&"string"!=typeof Q)for(var n in Q)F.d(e,n,function(B){return Q[B]}.bind(null,n));return e},F.n=function(B){var Q=B&&B.__esModule?function(){return B.default}:function(){return B};return F.d(Q,"a",Q),Q},F.o=function(B,Q){return Object.prototype.hasOwnProperty.call(B,Q)},F.p="/shiptimize-for-woocommerce/assets/js",F(F.s=7)}([function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n  function ShiptimizeUtils() {\n    _classCallCheck(this, ShiptimizeUtils);\n  }\n\n  /** \n   * Inject Script into the page \n   * @param string src \n   */\n\n\n  _createClass(ShiptimizeUtils, [{\n    key: "injectExternalScript",\n    value: function injectExternalScript(src) {\n      var s = document.createElement("script");\n      s.setAttribute("src", src);\n      document.body.appendChild(s);\n    }\n\n    /** \n     * Inject a script string \n     */\n\n  }, {\n    key: "injectScript",\n    value: function injectScript(contents) {\n      var e = document.createElement("script");\n      e.value = contents;\n      document.body.appendChild(e);\n    }\n\n    /** \n     * Removes all not numeric chars from the string \n     *\n     * @param string string - the input string \n     * @return the string without chars that are not numbers \n     */\n\n  }, {\n    key: "removeNonNumeric",\n    value: function removeNonNumeric(string) {\n      return string.replace(/\\D/g, \'\');\n    }\n\n    /** \n     * Check if the given url exists and is valid\n     * We use this to check if the carrier icon exists given \n     * a url path and the naming convention {carrier_id}.svg \n     * Make sure the correct protocol is appended to the url http != https \n     * \n     * @return true it the url exists and is valid \n     */\n\n  }, {\n    key: "isUrlValid",\n    value: function isUrlValid(url) {\n      var http = new XMLHttpRequest();\n      http.open(\'HEAD\', url, false);\n      http.send();\n      return http.status == 200;\n    }\n\n    /** \n     * Open a new window with the provided URL \n     * @string url \n     * @return bool if the window was opened, false if popup blocker enabled \n     */\n\n  }, {\n    key: "openNewWindow",\n    value: function openNewWindow(url, options) {\n      var newWin = window.open(url, \'_blank\', options);\n      var blocked = !newWin || newWin.closed || typeof newWin.closed == \'undefined\';\n\n      return !blocked;\n    }\n  }]);\n\n  return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdlIGNhbiB1c2UgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50IHN0dWZmIFxuICovXG5jbGFzcyBTaGlwdGltaXplVXRpbHMge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgU2NyaXB0IGludG8gdGhlIHBhZ2UgXG4gICAgICogQHBhcmFtIHN0cmluZyBzcmMgXG4gICAgICovXG4gICAgaW5qZWN0RXh0ZXJuYWxTY3JpcHQoc3JjKSB7XG4gICAgICAgIGxldCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgc3JjKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgYSBzY3JpcHQgc3RyaW5nIFxuICAgICAqL1xuICAgIGluamVjdFNjcmlwdChjb250ZW50cykge1xuICAgICAgICBsZXQgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIGUudmFsdWUgPSBjb250ZW50cztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogUmVtb3ZlcyBhbGwgbm90IG51bWVyaWMgY2hhcnMgZnJvbSB0aGUgc3RyaW5nIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBzdHJpbmcgLSB0aGUgaW5wdXQgc3RyaW5nIFxuICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRob3V0IGNoYXJzIHRoYXQgYXJlIG5vdCBudW1iZXJzIFxuICAgICAqL1xuICAgIHJlbW92ZU5vbk51bWVyaWMoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgaWYgdGhlIGNhcnJpZXIgaWNvbiBleGlzdHMgZ2l2ZW4gXG4gICAgICogYSB1cmwgcGF0aCBhbmQgdGhlIG5hbWluZyBjb252ZW50aW9uIHtjYXJyaWVyX2lkfS5zdmcgXG4gICAgICogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IHByb3RvY29sIGlzIGFwcGVuZGVkIHRvIHRoZSB1cmwgaHR0cCAhPSBodHRwcyBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaXQgdGhlIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkIFxuICAgICAqLyBcbiAgICBpc1VybFZhbGlkKHVybCkge1xuICAgICAgICB2YXIgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKTtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgICAgIHJldHVybiBodHRwLnN0YXR1cyA9PSAyMDA7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIE9wZW4gYSBuZXcgd2luZG93IHdpdGggdGhlIHByb3ZpZGVkIFVSTCBcbiAgICAgKiBAc3RyaW5nIHVybCBcbiAgICAgKiBAcmV0dXJuIGJvb2wgaWYgdGhlIHdpbmRvdyB3YXMgb3BlbmVkLCBmYWxzZSBpZiBwb3B1cCBibG9ja2VyIGVuYWJsZWQgXG4gICAgICovICBcbiAgICBvcGVuTmV3V2luZG93KHVybCwgb3B0aW9ucyl7XG4gICAgICAgIGxldCBuZXdXaW4gPSB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zKTsgXG4gICAgICAgIGxldCBibG9ja2VkID0gIW5ld1dpbiB8fCBuZXdXaW4uY2xvc2VkIHx8IHR5cGVvZiBuZXdXaW4uY2xvc2VkPT0ndW5kZWZpbmVkJzsgXG5cbiAgICAgICAgcmV0dXJuICFibG9ja2VkOyBcbiAgICB9XG59XG5cblxubGV0IHV0aWxzID0gbmV3IFNoaXB0aW1pemVVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},,,,,,,function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(8);\n\nvar _popper = __webpack_require__(9);\n\nvar _popper2 = _interopRequireDefault(_popper);\n\nvar _shiptimizeWooCommerceAdmin = __webpack_require__(11);\n\nvar _shiptimizeWooCommerceAdmin2 = _interopRequireDefault(_shiptimizeWooCommerceAdmin);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Shiptimize = function () {\n  function Shiptimize() {\n    _classCallCheck(this, Shiptimize);\n\n    console.log(\"I'm alive!\");\n  }\n\n  /** \n   *  \n   */\n\n\n  _createClass(Shiptimize, [{\n    key: 'bootstrap',\n    value: function bootstrap() {\n      this.tooltips();\n      this.platform = new _shiptimizeWooCommerceAdmin2.default();\n\n      this.loadAnalytics();\n      if (typeof this.platform.bootstrap != 'undefined') {\n        this.platform.bootstrap();\n      }\n    }\n  }, {\n    key: 'tooltips',\n    value: function tooltips() {\n      var toltip = jQuery(\".shiptimize-tooltip-message\");\n      var container = jQuery('#wpcontent');\n\n      if (toltip.size() == 0) {\n        return;\n      }\n\n      var me = this;\n      toltip.each(function (idx, elem) {\n        me.attachPopper(elem, container);\n      });\n    }\n  }, {\n    key: 'attachPopper',\n    value: function attachPopper(toltip, container) {\n      var eToltip = jQuery(toltip);\n      var toltipReference = eToltip.siblings(\".shiptimize-tooltip-reference\");\n      var arrow = eToltip.children('.shiptimize-tooltip-message__arrow').get(0);\n\n      var popper = new _popper2.default(toltipReference.get(0), toltip, {\n        placement: 'left',\n        modifiers: {\n          flip: {\n            behavior: ['top', 'left', 'bottom']\n          },\n          preventOverflow: {\n            boundariesElement: container\n          },\n          offset: {\n            enabled: true,\n            offset: '10,10'\n          },\n          arrow: {\n            enabled: true,\n            element: arrow\n          }\n        }\n      });\n      setTimeout(function () {\n        popper.update();\n      }, 200);\n    }\n  }, {\n    key: 'exportSuccess',\n    value: function exportSuccess(appLink) {\n      this.platform.exportSuccess(appLink);\n    }\n\n    /** \n     * @param string category \n     * @param string action \n     * @param string label \n     */\n\n  }, {\n    key: 'sendAnalyticsEvent',\n    value: function sendAnalyticsEvent(category, action, label) {\n      ga('shiptimize.send', 'event', category, action, label, { transport: 'beacon' });\n    }\n  }, {\n    key: 'loadAnalytics',\n    value: function loadAnalytics() {\n      if (typeof ga == 'undefined') {\n        (function (i, s, o, g, r, a, m) {\n          i['GoogleAnalyticsObject'] = r;\n          i[r] = i[r] || function () {\n            (i[r].q = i[r].q || []).push(arguments);\n          }, i[r].l = 1 * new Date();\n          a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n          a.async = 1;\n          a.src = g;\n          m.parentNode.insertBefore(a, m);\n        })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n        console.log(\"inserting analytics \");\n      }\n      ga('create', 'UA-101485643-1', 'auto', 'shiptimize');\n      ga('shiptimize.set', 'anonymizeIp', true);\n      console.log(\"creating tracker\");\n    }\n  }, {\n    key: 'printlabel',\n    value: function printlabel(event, orderid) {\n      var _this = this;\n\n      event.stopPropagation();\n      console.log(\"Printing label for orderid \", orderid);\n\n      var data = {\n        'action': 'shiptimize_print_label',\n        'orderid': orderid\n      };\n\n      this.openLoader(shiptimize_label_request);\n\n      jQuery.post(ajaxurl, data, function (data) {\n        console.log(data);\n\n        if (typeof data.response != 'undefined') {\n          if (typeof data.response.Error != 'undefined' && data.response.Error.Id > 0) {\n            _this.loaderMsg(data.response.Error.Info);\n\n            setTimeout(function () {\n              _this.closeLoader();\n            }, 2000);\n          }\n\n          if (typeof data.response.CallbackURL != 'undefined') {\n            _this.monitorLabelStatus(data.response.CallbackURL);\n          }\n        }\n\n        if (typeof data.errors != 'undefined') {\n          _this.loaderMsg(data.errors.join('<br/>'));\n          setTimeout(function () {\n            _this.closeLoader();\n          }, 5000);\n        }\n      }, \"json\");\n    }\n\n    /**\n     * Request the label status every 1s \n     */\n\n  }, {\n    key: 'monitorLabelStatus',\n    value: function monitorLabelStatus(callbackUrl) {\n      var _this2 = this;\n\n      var data = {\n        'action': 'shiptimize_label_status',\n        'callbackUrl': callbackUrl\n      };\n\n      jQuery.post(ajaxurl, data, function (data) {\n        console.log(data);\n\n        if (typeof data.response != 'undefined') {\n\n          // Check for falta errors \n          if (data.httpCode == '200') {\n            _this2.loaderMsg(shiptimize_label_request + ' ' + data.response.Finished + '%');\n          } else {\n            _this2.loaderMsg(\"Fatal API error \" + data.httpCode);\n            setTimeout(function () {\n              _this2.closeLoader();\n            }, 5000);\n            return;\n          }\n\n          // Print API errors\n          if (data.response.Error.Id > 0) {\n            _this2.loaderMsg(data.response.Error.Info);\n          }\n\n          if (data.response.Error.Id == 902) {\n            //No process running \n            setTimeout(function () {\n              _this2.closeLoader();\n            }, 2000);\n          }\n\n          if (data.response.Finished == 100) {\n            if (data.response.LabelFile.length > 0) {\n              var labelinfo = shiptimize_label_click.replace('%', '<a href=\"' + data.response.LabelFile + '\" target=\\'_blank\\'>' + shiptimize_label_label + '</a>');\n              var noticelist = jQuery(\"#wp__notice-list\");\n              noticelist.removeClass('woocommerce-layout__notice-list-hide');\n              noticelist.append('<div class=\"notice notice-info is-dismissible updated\">' + labelinfo + '</div>');\n              window.open(data.response.LabelFile, '_blank');\n              _this2.closeLoader();\n\n              /** \n               * Make sure the info is updated without the need to reload the page \n               */\n              for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n                var labelresult = data.response.ClientReferenceCodeList[x];\n                if (labelresult.Error.Id == 0) {\n                  jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass('shiptimize-icon-print-printed');\n                } else {\n                  jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n                }\n\n                jQuery(\"#shiptimize-tooltip\" + labelresult.ReferenceCode).html(labelresult.message);\n              }\n            } else {\n              var msg = '';\n              for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n                var _labelresult = data.response.ClientReferenceCodeList[0];\n                if (_labelresult.Error.Id > 0) {\n                  msg += \"<div class='shiptimize-label-error error'>\" + _labelresult.Error.Info + \"</div>\";\n                }\n                jQuery(\"#shiptimize-label\" + _labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n                jQuery(\"#shiptimize-tooltip\" + _labelresult.ReferenceCode).html(_labelresult.message);\n              }\n\n              _this2.loaderMsg(msg);\n              setTimeout(function () {\n                _this2.closeLoader();\n              }, 5000);\n            }\n          }\n\n          if (data.response.Finished < 100) {\n            setTimeout(function () {\n              _this2.monitorLabelStatus(callbackUrl);\n            }, 2000);\n          }\n        }\n      }, \"json\");\n    }\n  }, {\n    key: 'loaderMsg',\n    value: function loaderMsg(message) {\n      jQuery(\".shiptimize-loader-message\").html(message);\n    }\n  }, {\n    key: 'openLoader',\n    value: function openLoader(message) {\n      jQuery('body').append('<div class=\"shiptimize-loader-wrapper\"><div class=\"shiptimize-loader\"><div></div><div></div><div></div></div><div class=\"shiptimize-loader-message\">' + message + '</div></div>');\n    }\n  }, {\n    key: 'closeLoader',\n    value: function closeLoader() {\n      jQuery(\".shiptimize-loader-wrapper\").remove();\n    }\n  }]);\n\n  return Shiptimize;\n}();\n\njQuery(function () {\n  window.shiptimize = new Shiptimize();\n  window.shiptimize.bootstrap();\n  window.Popper = _popper2.default;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdGltaXplLWFkbWluLmpzPzM4YTIiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZSIsImNvbnNvbGUiLCJsb2ciLCJ0b29sdGlwcyIsInBsYXRmb3JtIiwiV29vU2hpcHRpbWl6ZSIsImxvYWRBbmFseXRpY3MiLCJib290c3RyYXAiLCJ0b2x0aXAiLCJqUXVlcnkiLCJjb250YWluZXIiLCJzaXplIiwibWUiLCJlYWNoIiwiaWR4IiwiZWxlbSIsImF0dGFjaFBvcHBlciIsImVUb2x0aXAiLCJ0b2x0aXBSZWZlcmVuY2UiLCJzaWJsaW5ncyIsImFycm93IiwiY2hpbGRyZW4iLCJnZXQiLCJwb3BwZXIiLCJQb3BwZXIiLCJwbGFjZW1lbnQiLCJtb2RpZmllcnMiLCJmbGlwIiwiYmVoYXZpb3IiLCJwcmV2ZW50T3ZlcmZsb3ciLCJib3VuZGFyaWVzRWxlbWVudCIsIm9mZnNldCIsImVuYWJsZWQiLCJlbGVtZW50Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsImFwcExpbmsiLCJleHBvcnRTdWNjZXNzIiwiY2F0ZWdvcnkiLCJhY3Rpb24iLCJsYWJlbCIsImdhIiwidHJhbnNwb3J0IiwiaSIsInMiLCJvIiwiZyIsInIiLCJhIiwibSIsInEiLCJwdXNoIiwiYXJndW1lbnRzIiwibCIsIkRhdGUiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImV2ZW50Iiwib3JkZXJpZCIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGEiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwicG9zdCIsImFqYXh1cmwiLCJyZXNwb25zZSIsIkVycm9yIiwiSWQiLCJsb2FkZXJNc2ciLCJJbmZvIiwiY2xvc2VMb2FkZXIiLCJDYWxsYmFja1VSTCIsIm1vbml0b3JMYWJlbFN0YXR1cyIsImVycm9ycyIsImpvaW4iLCJjYWxsYmFja1VybCIsImh0dHBDb2RlIiwiRmluaXNoZWQiLCJMYWJlbEZpbGUiLCJsZW5ndGgiLCJsYWJlbGluZm8iLCJzaGlwdGltaXplX2xhYmVsX2NsaWNrIiwicmVwbGFjZSIsInNoaXB0aW1pemVfbGFiZWxfbGFiZWwiLCJub3RpY2VsaXN0IiwicmVtb3ZlQ2xhc3MiLCJhcHBlbmQiLCJvcGVuIiwieCIsIkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0IiwibGFiZWxyZXN1bHQiLCJSZWZlcmVuY2VDb2RlIiwiYWRkQ2xhc3MiLCJodG1sIiwibWVzc2FnZSIsIm1zZyIsInJlbW92ZSIsInNoaXB0aW1pemUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFDQTs7OztBQUVBOzs7Ozs7OztJQUVNQSxVO0FBRUosd0JBQWE7QUFBQTs7QUFDWEMsWUFBUUMsR0FBUixDQUFZLFlBQVo7QUFDRDs7QUFFRDs7Ozs7OztnQ0FHVztBQUNULFdBQUtDLFFBQUw7QUFDQSxXQUFLQyxRQUFMLEdBQWdCLElBQUlDLG9DQUFKLEVBQWhCOztBQUVBLFdBQUtDLGFBQUw7QUFDQSxVQUFHLE9BQU8sS0FBS0YsUUFBTCxDQUFjRyxTQUFyQixJQUFtQyxXQUF0QyxFQUFtRDtBQUNqRCxhQUFLSCxRQUFMLENBQWNHLFNBQWQ7QUFDRDtBQUNGOzs7K0JBRVU7QUFDVCxVQUFJQyxTQUFTQyxPQUFPLDZCQUFQLENBQWI7QUFDQSxVQUFJQyxZQUFZRCxPQUFPLFlBQVAsQ0FBaEI7O0FBRUEsVUFBS0QsT0FBT0csSUFBUCxNQUFpQixDQUF0QixFQUEwQjtBQUN4QjtBQUNEOztBQUVELFVBQUlDLEtBQUssSUFBVDtBQUNBSixhQUFPSyxJQUFQLENBQWEsVUFBV0MsR0FBWCxFQUFnQkMsSUFBaEIsRUFBdUI7QUFDbENILFdBQUdJLFlBQUgsQ0FBZ0JELElBQWhCLEVBQXFCTCxTQUFyQjtBQUNELE9BRkQ7QUFJRDs7O2lDQUVZRixNLEVBQVFFLFMsRUFBVTtBQUM3QixVQUFJTyxVQUFVUixPQUFPRCxNQUFQLENBQWQ7QUFDQSxVQUFJ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QWY7QUFDQW5FLHlCQUFXLFlBQU07QUFBRSx1QkFBSzBDLFdBQUw7QUFBcUIsZUFBeEMsRUFBMEMsSUFBMUM7QUFDRDtBQUNGOztBQUVELGNBQUdWLEtBQUtLLFFBQUwsQ0FBY1ksUUFBZCxHQUF5QixHQUE1QixFQUFpQztBQUMvQmpELHVCQUFZLFlBQU07QUFBRSxxQkFBSzRDLGtCQUFMLENBQXdCRyxXQUF4QjtBQUF1QyxhQUEzRCxFQUE2RCxJQUE3RDtBQUNEO0FBQ0Y7QUFFRixPQXZFRCxFQXVFRyxNQXZFSDtBQXdFRDs7OzhCQUVTbUIsTyxFQUFTO0FBQ2pCM0YsYUFBTyw0QkFBUCxFQUFxQzBGLElBQXJDLENBQTBDQyxPQUExQztBQUNEOzs7K0JBRVVBLE8sRUFBUztBQUNsQjNGLGFBQU8sTUFBUCxFQUFlbUYsTUFBZixDQUFzQix5SkFBeUpRLE9BQXpKLEdBQW9LLGNBQTFMO0FBQ0Q7OztrQ0FFWTtBQUNYM0YsYUFBTyw0QkFBUCxFQUFxQzZGLE1BQXJDO0FBQ0Q7Ozs7OztBQUdIN0YsT0FBTyxZQUFZO0FBQ2pCb0QsU0FBTzBDLFVBQVAsR0FBb0IsSUFBSXZHLFVBQUosRUFBcEI7QUFDQTZELFNBQU8wQyxVQUFQLENBQWtCaEcsU0FBbEI7QUFDQXNELFNBQU9yQyxNQUFQLEdBQWdCQSxnQkFBaEI7QUFDRCxDQUpEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vc2Nzcy9zaGlwdGltaXplLWFkbWluLnNjc3MnO1xuaW1wb3J0IFBvcHBlciBmcm9tICdwb3BwZXIuanMnOyBcblxuaW1wb3J0IFdvb1NoaXB0aW1pemUgIGZyb20gJy4vanMvc2hpcHRpbWl6ZS13b28tY29tbWVyY2UtYWRtaW4uanMnOyBcblxuY2xhc3MgU2hpcHRpbWl6ZSB7XG5cbiAgY29uc3RydWN0b3IoKXtcbiAgICBjb25zb2xlLmxvZyhcIkknbSBhbGl2ZSFcIik7IFxuICB9XG5cbiAgLyoqIFxuICAgKiAgXG4gICAqLyBcbiAgYm9vdHN0cmFwKCl7XG4gICAgdGhpcy50b29sdGlwcygpOyBcbiAgICB0aGlzLnBsYXRmb3JtID0gbmV3IFdvb1NoaXB0aW1pemUoKTsgXG5cbiAgICB0aGlzLmxvYWRBbmFseXRpY3MoKTsgXG4gICAgaWYodHlwZW9mKHRoaXMucGxhdGZvcm0uYm9vdHN0cmFwKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wbGF0Zm9ybS5ib290c3RyYXAoKTtcbiAgICB9XG4gIH1cblxuICB0b29sdGlwcyggKXtcbiAgICBsZXQgdG9sdGlwID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtdG9vbHRpcC1tZXNzYWdlXCIpO1xuICAgIGxldCBjb250YWluZXIgPSBqUXVlcnkoJyN3cGNvbnRlbnQnKTsgXG5cbiAgICBpZiAoIHRvbHRpcC5zaXplKCkgPT0gMCApIHtcbiAgICAgIHJldHVybjsgXG4gICAgfVxuXG4gICAgbGV0IG1lID0gdGhpczsgXG4gICAgdG9sdGlwLmVhY2goIGZ1bmN0aW9uICggaWR4LCBlbGVtICkge1xuICAgICAgbWUuYXR0YWNoUG9wcGVyKGVsZW0sY29udGFpbmVyKTtcbiAgICB9KTsgICAgICBcblxuICB9XG5cbiAgYXR0YWNoUG9wcGVyKHRvbHRpcCwgY29udGFpbmVyKXsgIFxuICAgIGxldCBlVG9sdGlwID0galF1ZXJ5KHRvbHRpcCk7IFxuICAgIGxldCB0b2x0aXBSZWZlcmVuY2UgPSBlVG9sdGlwLnNpYmxpbmdzKFwiLnNoaXB0aW1pemUtdG9vbHRpcC1yZWZlcmVuY2VcIik7XG4gICAgbGV0IGFycm93ID0gZVRvbHRpcC5jaGlsZHJlbignLnNoaXB0aW1pemUtdG9vbHRpcC1tZXNzYWdlX19hcnJvdycpLmdldCgwKTsgXG5cbiAgICB2YXIgcG9wcGVyID0gbmV3IFBvcHBlcih0b2x0aXBSZWZlcmVuY2UuZ2V0KDApLCB0b2x0aXAsIHtcbiAgICAgIHBsYWNlbWVudDogJ2xlZnQnLFxuICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogWyd0b3AnLCdsZWZ0JywgJ2JvdHRvbSddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IGNvbnRhaW5lcixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9mZnNldDogeyBcbiAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiAnMTAsMTAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGFycm93XG4gICAgICAgICAgfVxuICAgICAgfSwgXG4gICAgfSk7ICBcbiAgICBzZXRUaW1lb3V0ICggKCkgPT4geyBwb3BwZXIudXBkYXRlKCk7IH0gLCAyMDApOyAgICAgXG4gIH1cblxuICBleHBvcnRTdWNjZXNzKGFwcExpbmspe1xuICAgIHRoaXMucGxhdGZvcm0uZXhwb3J0U3VjY2VzcyhhcHBMaW5rKTtcbiAgfVxuXG4gIC8qKiBcbiAgICogQHBhcmFtIHN0cmluZyBjYXRlZ29yeSBcbiAgICogQHBhcmFtIHN0cmluZyBhY3Rpb24gXG4gICAqIEBwYXJhbSBzdHJpbmcgbGFiZWwgXG4gICAqL1xuICBzZW5kQW5hbHl0aWNzRXZlbnQoY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwpIHtcbiAgICAgIGdhKCdzaGlwdGltaXplLnNlbmQnLCAnZXZlbnQnLCBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgeyB0cmFuc3BvcnQ6ICdiZWFjb24nIH0pO1xuICB9XG5cbiAgbG9hZEFuYWx5dGljcygpIHtcbiAgICAgIGlmICh0eXBlb2YoZ2EpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgKGZ1bmN0aW9uKGksIHMsIG8sIGcsIHIsIGEsIG0pIHtcbiAgICAgICAgICAgICAgaVsnR29vZ2xlQW5hbHl0aWNzT2JqZWN0J10gPSByO1xuICAgICAgICAgICAgICBpW3JdID0gaVtyXSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIChpW3JdLnEgPSBpW3JdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKVxuICAgICAgICAgICAgICB9LCBpW3JdLmwgPSAxICogbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgYSA9IHMuY3JlYXRlRWxlbWVudChvKSxcbiAgICAgICAgICAgICAgICAgIG0gPSBzLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO1xuICAgICAgICAgICAgICBhLmFzeW5jID0gMTtcbiAgICAgICAgICAgICAgYS5zcmMgPSBnO1xuICAgICAgICAgICAgICBtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pXG4gICAgICAgICAgfSkod2luZG93LCBkb2N1bWVudCwgJ3NjcmlwdCcsICdodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanMnLCAnZ2EnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImluc2VydGluZyBhbmFseXRpY3MgXCIpO1xuICAgICAgfSBcbiAgICAgIGdhKCdjcmVhdGUnLCAnVUEtMTAxNDg1NjQzLTEnLCAnYXV0bycsICdzaGlwdGltaXplJyk7XG4gICAgICBnYSgnc2hpcHRpbWl6ZS5zZXQnLCAnYW5vbnltaXplSXAnLCB0cnVlKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRpbmcgdHJhY2tlclwiKTtcbiAgfVxuXG4gIHByaW50bGFiZWwoZXZlbnQsIG9yZGVyaWQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgXG4gICAgY29uc29sZS5sb2cgKFwiUHJpbnRpbmcgbGFiZWwgZm9yIG9yZGVyaWQgXCIsIG9yZGVyaWQpO1xuXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfcHJpbnRfbGFiZWwnLCBcbiAgICAgICdvcmRlcmlkJzogb3JkZXJpZFxuICAgIH07IFxuXG4gICAgdGhpcy5vcGVuTG9hZGVyKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCk7IFxuXG4gICAgalF1ZXJ5LnBvc3QoYWpheHVybCwgZGF0YSwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGRhdGEpOyBcblxuICAgICAgaWYgKHR5cGVvZihkYXRhLnJlc3BvbnNlKSAhPSAndW5kZWZpbmVkJyApIHtcbiAgICAgICAgICBpZih0eXBlb2YoZGF0YS5yZXNwb25zZS5FcnJvcikgIT0gJ3VuZGVmaW5lZCcgJiYgZGF0YS5yZXNwb25zZS5FcnJvci5JZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyTXNnKGRhdGEucmVzcG9uc2UuRXJyb3IuSW5mbyk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDIwMDApOyAgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYodHlwZW9mKGRhdGEucmVzcG9uc2UuQ2FsbGJhY2tVUkwpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm1vbml0b3JMYWJlbFN0YXR1cyhkYXRhLnJlc3BvbnNlLkNhbGxiYWNrVVJMKTsgICAgICAgICAgICAgXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0eXBlb2YoZGF0YS5lcnJvcnMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZGVyTXNnKGRhdGEuZXJyb3JzLmpvaW4oJzxici8+JykpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbG9zZUxvYWRlcigpOyB9LCA1MDAwKTsgIFxuICAgICAgfVxuICAgIH0sIFwianNvblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBsYWJlbCBzdGF0dXMgZXZlcnkgMXMgXG4gICAqL1xuICBtb25pdG9yTGFiZWxTdGF0dXMoY2FsbGJhY2tVcmwpIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9sYWJlbF9zdGF0dXMnLFxuICAgICAgJ2NhbGxiYWNrVXJsJzogY2FsbGJhY2tVcmxcbiAgICB9OyBcblxuICAgIGpRdWVyeS5wb3N0KGFqYXh1cmwsIGRhdGEsIChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhkYXRhKTsgXG5cbiAgICAgIGlmKHR5cGVvZihkYXRhLnJlc3BvbnNlKSE9ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGZhbHRhIGVycm9ycyBcbiAgICAgICAgaWYoZGF0YS5odHRwQ29kZSA9PSAnMjAwJykge1xuICAgICAgICAgIHRoaXMubG9hZGVyTXNnKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCArICcgJyArIGRhdGEucmVzcG9uc2UuRmluaXNoZWQgKyAnJScpOyAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZGVyTXNnKFwiRmF0YWwgQVBJIGVycm9yIFwiICsgZGF0YS5odHRwQ29kZSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgNTAwMCk7XG4gICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByaW50IEFQSSBlcnJvcnNcbiAgICAgICAgaWYgKGRhdGEucmVzcG9uc2UuRXJyb3IuSWQgPiAwKSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5yZXNwb25zZS5FcnJvci5JbmZvKTsgXG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLnJlc3BvbnNlLkVycm9yLklkID09IDkwMikgeyAvL05vIHByb2Nlc3MgcnVubmluZyBcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRlcigpXG4gICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLnJlc3BvbnNlLkZpbmlzaGVkID09IDEwMCApIHtcbiAgICAgICAgICBpZiAoIGRhdGEucmVzcG9uc2UuTGFiZWxGaWxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYWJlbGluZm8gPSBzaGlwdGltaXplX2xhYmVsX2NsaWNrLnJlcGxhY2UoJyUnLGA8YSBocmVmPVwiJHtkYXRhLnJlc3BvbnNlLkxhYmVsRmlsZX1cIiB0YXJnZXQ9J19ibGFuayc+JHtzaGlwdGltaXplX2xhYmVsX2xhYmVsfTwvYT5gKTtcbiAgICAgICAgICAgIGxldCBub3RpY2VsaXN0ID0galF1ZXJ5KFwiI3dwX19ub3RpY2UtbGlzdFwiKTsgXG4gICAgICAgICAgICBub3RpY2VsaXN0LnJlbW92ZUNsYXNzKCd3b29jb21tZXJjZS1sYXlvdXRfX25vdGljZS1saXN0LWhpZGUnKTsgXG4gICAgICAgICAgICBub3RpY2VsaXN0LmFwcGVuZChgPGRpdiBjbGFzcz1cIm5vdGljZSBub3RpY2UtaW5mbyBpcy1kaXNtaXNzaWJsZSB1cGRhdGVkXCI+JHtsYWJlbGluZm99PC9kaXY+YCk7XG4gICAgICAgICAgICB3aW5kb3cub3BlbihkYXRhLnJlc3BvbnNlLkxhYmVsRmlsZSwnX2JsYW5rJyk7IFxuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRlcigpO1xuXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGluZm8gaXMgdXBkYXRlZCB3aXRob3V0IHRoZSBuZWVkIHRvIHJlbG9hZCB0aGUgcGFnZSBcbiAgICAgICAgICAgICAqLyBcbiAgICAgICAgICAgIGZvcih2YXIgeCA9MDsgeCA8IGRhdGEucmVzcG9uc2UuQ2xpZW50UmVmZXJlbmNlQ29kZUxpc3QubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgICAgdmFyIGxhYmVscmVzdWx0ID0gZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdFt4XTsgXG4gICAgICAgICAgICAgIGlmKGxhYmVscmVzdWx0LkVycm9yLklkID09IDApIHsgXG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKCdzaGlwdGltaXplLWljb24tcHJpbnQtcHJpbnRlZCcpOyAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWxhYmVsXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5hZGRDbGFzcyhcInNoaXB0aW1pemUtaWNvbi1wcmludC1lcnJvclwiKTsgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS10b29sdGlwXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5odG1sKGxhYmVscmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSAnJzsgXG4gICAgICAgICAgICBmb3IgKCB2YXIgeD0wOyB4IDwgZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdC5sZW5ndGg7ICsreCApIHtcbiAgICAgICAgICAgICAgbGV0IGxhYmVscmVzdWx0ID0gZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdFswXTsgXG4gICAgICAgICAgICAgIGlmKGxhYmVscmVzdWx0LkVycm9yLklkID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBcIjxkaXYgY2xhc3M9J3NoaXB0aW1pemUtbGFiZWwtZXJyb3IgZXJyb3InPlwiICsgbGFiZWxyZXN1bHQuRXJyb3IuSW5mbyArIFwiPC9kaXY+XCI7IFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWxhYmVsXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5hZGRDbGFzcyhcInNoaXB0aW1pemUtaWNvbi1wcmludC1lcnJvclwiKTsgIFxuICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS10b29sdGlwXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5odG1sKGxhYmVscmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRlck1zZyhtc2cpOyBcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDUwMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRmluaXNoZWQgPCAxMDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7IHRoaXMubW9uaXRvckxhYmVsU3RhdHVzKGNhbGxiYWNrVXJsKTsgfSwgMjAwMCk7IFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9LCBcImpzb25cIik7XG4gIH1cblxuICBsb2FkZXJNc2cobWVzc2FnZSkge1xuICAgIGpRdWVyeShcIi5zaGlwdGltaXplLWxvYWRlci1tZXNzYWdlXCIpLmh0bWwobWVzc2FnZSk7IFxuICB9XG5cbiAgb3BlbkxvYWRlcihtZXNzYWdlKSB7XG4gICAgalF1ZXJ5KCdib2R5JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1sb2FkZXItd3JhcHBlclwiPjxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlclwiPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlci1tZXNzYWdlXCI+JyArIG1lc3NhZ2UgICsgJzwvZGl2PjwvZGl2PicpOyBcbiAgfVxuXG4gIGNsb3NlTG9hZGVyKCl7XG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtbG9hZGVyLXdyYXBwZXJcIikucmVtb3ZlKCk7IFxuICB9XG59XG5cbmpRdWVyeShmdW5jdGlvbiAoKSB7XG4gIHdpbmRvdy5zaGlwdGltaXplID0gbmV3IFNoaXB0aW1pemUoKTtcbiAgd2luZG93LnNoaXB0aW1pemUuYm9vdHN0cmFwKCk7IFxuICB3aW5kb3cuUG9wcGVyID0gUG9wcGVyO1xufSk7XG5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcz82MGM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n")},function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n  var called = false;\n  return function () {\n    if (called) {\n      return;\n    }\n    called = true;\n    window.Promise.resolve().then(function () {\n      called = false;\n      fn();\n    });\n  };\n}\n\nfunction taskDebounce(fn) {\n  var scheduled = false;\n  return function () {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(function () {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n  var getType = {};\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  var window = element.ownerDocument.defaultView;\n  var css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body;\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body;\n    case '#document':\n      return element.body;\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n\n  var _getStyleComputedProp = getStyleComputedProperty(element),\n      overflow = _getStyleComputedProp.overflow,\n      overflowX = _getStyleComputedProp.overflowX,\n      overflowY = _getStyleComputedProp.overflowY;\n\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  var noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  var offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  var nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n  var start = order ? element1 : element2;\n  var end = order ? element2 : element1;\n\n  // Get common ancestor container\n  var range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  var commonAncestorContainer = range.commonAncestorContainer;\n\n  // Both nodes are inside #document\n\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  var element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    var html = element.ownerDocument.documentElement;\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var scrollTop = getScroll(element, 'top');\n  var scrollLeft = getScroll(element, 'left');\n  var modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n  var sideA = axis === 'x' ? 'Left' : 'Top';\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n  var body = document.body;\n  var html = document.documentElement;\n  var computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle)\n  };\n}\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar defineProperty = function defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n  return _extends({}, offsets, {\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height\n  });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n  var rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      var scrollTop = getScroll(element, 'top');\n      var scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    } else {\n      rect = element.getBoundingClientRect();\n    }\n  } catch (e) {}\n\n  var result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top\n  };\n\n  // subtract scrollbar size from sizes\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  var width = sizes.width || element.clientWidth || result.width;\n  var height = sizes.height || element.clientHeight || result.height;\n\n  var horizScrollbar = element.offsetWidth - width;\n  var vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    var styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var isIE10 = isIE(10);\n  var isHTML = parent.nodeName === 'HTML';\n  var childrenRect = getBoundingClientRect(children);\n  var parentRect = getBoundingClientRect(parent);\n  var scrollParent = getScrollParent(children);\n\n  var styles = getStyleComputedProperty(parent);\n  var borderTopWidth = parseFloat(styles.borderTopWidth);\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if (fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  var offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    var marginTop = parseFloat(styles.marginTop);\n    var marginLeft = parseFloat(styles.marginLeft);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var html = element.ownerDocument.documentElement;\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  var scrollTop = !excludeScroll ? getScroll(html) : 0;\n  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  var offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width: width,\n    height: height\n  };\n\n  return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n  var nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  var parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  var el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n  // NOTE: 1 DOM access here\n\n  var boundaries = { top: 0, left: 0 };\n  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport') {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  } else {\n    // Handle other cases based on DOM element used as boundaries\n    var boundariesNode = void 0;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n          height = _getWindowSizes.height,\n          width = _getWindowSizes.width;\n\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  var isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n  boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n  return boundaries;\n}\n\nfunction getArea(_ref) {\n  var width = _ref.width,\n      height = _ref.height;\n\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n  var rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height\n    }\n  };\n\n  var sortedAreas = Object.keys(rects).map(function (key) {\n    return _extends({\n      key: key\n    }, rects[key], {\n      area: getArea(rects[key])\n    });\n  }).sort(function (a, b) {\n    return b.area - a.area;\n  });\n\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\n    var width = _ref2.width,\n        height = _ref2.height;\n    return width >= popper.clientWidth && height >= popper.clientHeight;\n  });\n\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n  var variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n  var window = element.ownerDocument.defaultView;\n  var styles = window.getComputedStyle(element);\n  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  var result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x\n  };\n  return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  var popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  var popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  var mainSide = isHoriz ? 'top' : 'left';\n  var secondarySide = isHoriz ? 'left' : 'top';\n  var measurement = isHoriz ? 'height' : 'width';\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(function (cur) {\n      return cur[prop] === value;\n    });\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  var match = find(arr, function (obj) {\n    return obj[prop] === value;\n  });\n  return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(function (modifier) {\n    if (modifier['function']) {\n      // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  var data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {}\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  data.positionFixed = this.options.positionFixed;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(function (_ref) {\n    var name = _ref.name,\n        enabled = _ref.enabled;\n    return enabled && name === modifierName;\n  });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (var i = 0; i < prefixes.length; i++) {\n    var prefix = prefixes[i];\n    var toCheck = prefix ? '' + prefix + upperProp : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n  var ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  var isBody = scrollParent.nodeName === 'BODY';\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  var scrollElement = getScrollParent(reference);\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n  }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(function (target) {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n  Object.keys(styles).forEach(function (prop) {\n    var unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function (prop) {\n    var value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n  // compute reference element offsets\n  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n  return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var round = Math.round,\n      floor = Math.floor;\n\n  var noRound = function noRound(v) {\n    return v;\n  };\n\n  var referenceWidth = round(reference.width);\n  var popperWidth = round(popper.width);\n\n  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  var isVariation = data.placement.indexOf('-') !== -1;\n  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n  var verticalToInteger = !shouldRound ? noRound : round;\n\n  return {\n    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right)\n  };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n  var x = options.x,\n      y = options.y;\n  var popper = data.offsets.popper;\n\n  // Remove this legacy support in Popper.js v2\n\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'applyStyle';\n  }).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n  }\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n  var offsetParent = getOffsetParent(data.instance.popper);\n  var offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  var styles = {\n    position: popper.position\n  };\n\n  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\n  var sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  var prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  var left = void 0,\n      top = void 0;\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    var invertTop = sideA === 'bottom' ? -1 : 1;\n    var invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = sideA + ', ' + sideB;\n  }\n\n  // Attributes\n  var attributes = {\n    'x-placement': data.placement\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = _extends({}, attributes, data.attributes);\n  data.styles = _extends({}, styles, data.styles);\n  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n  return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n  var requesting = find(modifiers, function (_ref) {\n    var name = _ref.name;\n    return name === requestingName;\n  });\n\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n  });\n\n  if (!isRequired) {\n    var _requesting = '`' + requestingName + '`';\n    var requested = '`' + requestedName + '`';\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n  }\n  return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n  var _data$offsets$arrow;\n\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  var arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\n      return data;\n    }\n  }\n\n  var placement = data.placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  var len = isVertical ? 'height' : 'width';\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\n  var side = sideCapitalized.toLowerCase();\n  var altSide = isVertical ? 'left' : 'top';\n  var opSide = isVertical ? 'bottom' : 'right';\n  var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  var css = getStyleComputedProperty(data.instance.popper);\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n  return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var index = validPlacements.indexOf(placement);\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n  var placement = data.placement.split('-')[0];\n  var placementOpposite = getOppositePlacement(placement);\n  var variation = data.placement.split('-')[1] || '';\n\n  var flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach(function (step, index) {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    var popperOffsets = data.offsets.popper;\n    var refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    var floor = Math.floor;\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n    // flip the variation if required\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n    // flips variation if reference element overflows boundaries\n    var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n    // flips variation if popper content overflows boundaries\n    var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n    var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var placement = data.placement.split('-')[0];\n  var floor = Math.floor;\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  var side = isVertical ? 'right' : 'bottom';\n  var opSide = isVertical ? 'left' : 'top';\n  var measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  var value = +split[1];\n  var unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    var element = void 0;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    var rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    var size = void 0;\n    if (unit === 'vh') {\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n    } else {\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n  var offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n    return frag.trim();\n  });\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  var divider = fragments.indexOf(find(fragments, function (frag) {\n    return frag.search(/,|\\s/) !== -1;\n  }));\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  var splitRegex = /\\s*,\\s*|\\s+/;\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map(function (op, index) {\n    // Most of the units rely on the orientation of the popper\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n    var mergeWithPrevious = false;\n    return op\n    // This aggregates any `+` or `-` sign that aren't considered operators\n    // e.g.: 10 + +5 => [10, +, +5]\n    .reduce(function (a, b) {\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n        a[a.length - 1] = b;\n        mergeWithPrevious = true;\n        return a;\n      } else if (mergeWithPrevious) {\n        a[a.length - 1] += b;\n        mergeWithPrevious = false;\n        return a;\n      } else {\n        return a.concat(b);\n      }\n    }, [])\n    // Here we convert the string values into number values (in px)\n    .map(function (str) {\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\n    });\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach(function (op, index) {\n    op.forEach(function (frag, index2) {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n  var offset = _ref.offset;\n  var placement = data.placement,\n      _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var basePlacement = placement.split('-')[0];\n\n  var offsets = void 0;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n  var transformProp = getSupportedPropertyName('transform');\n  var popperStyles = data.instance.popper.style; // assignment to help minification\n  var top = popperStyles.top,\n      left = popperStyles.left,\n      transform = popperStyles[transformProp];\n\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n  // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n\n  options.boundaries = boundaries;\n\n  var order = options.priority;\n  var popper = data.offsets.popper;\n\n  var check = {\n    primary: function primary(placement) {\n      var value = popper[placement];\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return defineProperty({}, placement, value);\n    },\n    secondary: function secondary(placement) {\n      var mainSide = placement === 'right' ? 'left' : 'top';\n      var value = popper[mainSide];\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n      }\n      return defineProperty({}, mainSide, value);\n    }\n  };\n\n  order.forEach(function (placement) {\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = _extends({}, popper, check[side](placement));\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    var _data$offsets = data.offsets,\n        reference = _data$offsets.reference,\n        popper = _data$offsets.popper;\n\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    var side = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    var shiftOffsets = {\n      start: defineProperty({}, side, reference[side]),\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n    };\n\n    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  var refRect = data.offsets.reference;\n  var bound = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'preventOverflow';\n  }).boundaries;\n\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent'\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]'\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right'\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined\n  }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: function onCreate() {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: function onUpdate() {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  function Popper(reference, popper) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    classCallCheck(this, Popper);\n\n    this.scheduleUpdate = function () {\n      return requestAnimationFrame(_this.update);\n    };\n\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = _extends({}, Popper.Defaults, options);\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: []\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n      return _extends({\n        name: name\n      }, _this.options.modifiers[name]);\n    })\n    // sort the modifiers by order\n    .sort(function (a, b) {\n      return a.order - b.order;\n    });\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(function (modifierOptions) {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    var eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n\n\n  createClass(Popper, [{\n    key: 'update',\n    value: function update$$1() {\n      return update.call(this);\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy$$1() {\n      return destroy.call(this);\n    }\n  }, {\n    key: 'enableEventListeners',\n    value: function enableEventListeners$$1() {\n      return enableEventListeners.call(this);\n    }\n  }, {\n    key: 'disableEventListeners',\n    value: function disableEventListeners$$1() {\n      return disableEventListeners.call(this);\n    }\n\n    /**\n     * Schedules an update. It will run on the next UI update available.\n     * @method scheduleUpdate\n     * @memberof Popper\n     */\n\n    /**\n     * Collection of utilities useful when writing custom modifiers.\n     * Starting from version 1.7, this method is available only if you\n     * include `popper-utils.js` before `popper.js`.\n     *\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\n     * and will be removed in v2! Use the PopperUtils module directly instead.\n     * Due to the high instability of the methods contained in Utils, we can't\n     * guarantee them to follow semver. Use them at your own risk!\n     * @static\n     * @private\n     * @type {Object}\n     * @deprecated since version 1.8\n     * @member Utils\n     * @memberof Popper\n     */\n\n  }]);\n  return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexports.default = Popper;\n//# sourceMappingURL=popper.js.map\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz9mMGJkIl0sIm5hbWVzIjpbImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwidGltZW91dER1cmF0aW9uIiwibG9uZ2VyVGltZW91dEJyb3dzZXJzIiwiaSIsImxlbmd0aCIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJtaWNyb3Rhc2tEZWJvdW5jZSIsImZuIiwiY2FsbGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwidGFza0RlYm91bmNlIiwic2NoZWR1bGVkIiwic2V0VGltZW91dCIsInN1cHBvcnRzTWljcm9UYXNrcyIsImRlYm91bmNlIiwiaXNGdW5jdGlvbiIsImZ1bmN0aW9uVG9DaGVjayIsImdldFR5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkiLCJlbGVtZW50IiwicHJvcGVydHkiLCJub2RlVHlwZSIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsImNzcyIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQYXJlbnROb2RlIiwibm9kZU5hbWUiLCJwYXJlbnROb2RlIiwiaG9zdCIsImdldFNjcm9sbFBhcmVudCIsImJvZHkiLCJfZ2V0U3R5bGVDb21wdXRlZFByb3AiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsInRlc3QiLCJnZXRSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlTm9kZSIsImlzSUUxMSIsIk1TSW5wdXRNZXRob2RDb250ZXh0IiwiZG9jdW1lbnRNb2RlIiwiaXNJRTEwIiwiaXNJRSIsInZlcnNpb24iLCJnZXRPZmZzZXRQYXJlbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJub09mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsIm5leHRFbGVtZW50U2libGluZyIsImlzT2Zmc2V0Q29udGFpbmVyIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRSb290Iiwibm9kZSIsImZpbmRDb21tb25PZmZzZXRQYXJlbnQiLCJlbGVtZW50MSIsImVsZW1lbnQyIiwib3JkZXIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzdGFydCIsImVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRTdGFydCIsInNldEVuZCIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiY29udGFpbnMiLCJlbGVtZW50MXJvb3QiLCJnZXRTY3JvbGwiLCJzaWRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwidXBwZXJTaWRlIiwiaHRtbCIsInNjcm9sbGluZ0VsZW1lbnQiLCJpbmNsdWRlU2Nyb2xsIiwicmVjdCIsInN1YnRyYWN0Iiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsIm1vZGlmaWVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiZ2V0Qm9yZGVyc1NpemUiLCJzdHlsZXMiLCJheGlzIiwic2lkZUEiLCJzaWRlQiIsInBhcnNlRmxvYXQiLCJnZXRTaXplIiwiY29tcHV0ZWRTdHlsZSIsIk1hdGgiLCJtYXgiLCJwYXJzZUludCIsImdldFdpbmRvd1NpemVzIiwiaGVpZ2h0Iiwid2lkdGgiLCJjbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJjcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsInByb3RvdHlwZSIsIm9iaiIsInZhbHVlIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImdldENsaWVudFJlY3QiLCJvZmZzZXRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZSIsInJlc3VsdCIsInNpemVzIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJob3JpelNjcm9sbGJhciIsIm9mZnNldFdpZHRoIiwidmVydFNjcm9sbGJhciIsIm9mZnNldEhlaWdodCIsImdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZSIsImNoaWxkcmVuIiwicGFyZW50IiwiZml4ZWRQb3NpdGlvbiIsImlzSFRNTCIsImNoaWxkcmVuUmVjdCIsInBhcmVudFJlY3QiLCJzY3JvbGxQYXJlbnQiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckxlZnRXaWR0aCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUiLCJleGNsdWRlU2Nyb2xsIiwicmVsYXRpdmVPZmZzZXQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJvZmZzZXQiLCJpc0ZpeGVkIiwiZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCIsInBhcmVudEVsZW1lbnQiLCJlbCIsImdldEJvdW5kYXJpZXMiLCJwb3BwZXIiLCJwYWRkaW5nIiwiYm91bmRhcmllc0VsZW1lbnQiLCJib3VuZGFyaWVzIiwiYm91bmRhcmllc05vZGUiLCJfZ2V0V2luZG93U2l6ZXMiLCJpc1BhZGRpbmdOdW1iZXIiLCJnZXRBcmVhIiwiX3JlZiIsImNvbXB1dGVBdXRvUGxhY2VtZW50IiwicGxhY2VtZW50IiwicmVmUmVjdCIsInJlY3RzIiwic29ydGVkQXJlYXMiLCJrZXlzIiwibWFwIiwiYXJlYSIsInNvcnQiLCJhIiwiYiIsImZpbHRlcmVkQXJlYXMiLCJmaWx0ZXIiLCJfcmVmMiIsImNvbXB1dGVkUGxhY2VtZW50IiwidmFyaWF0aW9uIiwic3BsaXQiLCJnZXRSZWZlcmVuY2VPZmZzZXRzIiwic3RhdGUiLCJjb21tb25PZmZzZXRQYXJlbnQiLCJnZXRPdXRlclNpemVzIiwieCIsIm1hcmdpbkJvdHRvbSIsInkiLCJtYXJnaW5SaWdodCIsImdldE9wcG9zaXRlUGxhY2VtZW50IiwiaGFzaCIsInJlcGxhY2UiLCJtYXRjaGVkIiwiZ2V0UG9wcGVyT2Zmc2V0cyIsInJlZmVyZW5jZU9mZnNldHMiLCJwb3BwZXJSZWN0IiwicG9wcGVyT2Zmc2V0cyIsImlzSG9yaXoiLCJtYWluU2lkZSIsInNlY29uZGFyeVNpZGUiLCJtZWFzdXJlbWVudCIsInNlY29uZGFyeU1lYXN1cmVtZW50IiwiZmluZCIsImFyciIsImNoZWNrIiwiQXJyYXkiLCJmaW5kSW5kZXgiLCJwcm9wIiwiY3VyIiwibWF0Y2giLCJydW5Nb2RpZmllcnMiLCJtb2RpZmllcnMiLCJkYXRhIiwiZW5kcyIsIm1vZGlmaWVyc1RvUnVuIiwic2xpY2UiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJlbmFibGVkIiwidXBkYXRlIiwiaXNEZXN0cm95ZWQiLCJhcnJvd1N0eWxlcyIsImF0dHJpYnV0ZXMiLCJmbGlwcGVkIiwib3B0aW9ucyIsInBvc2l0aW9uRml4ZWQiLCJmbGlwIiwib3JpZ2luYWxQbGFjZW1lbnQiLCJwb3NpdGlvbiIsImlzQ3JlYXRlZCIsIm9uQ3JlYXRlIiwib25VcGRhdGUiLCJpc01vZGlmaWVyRW5hYmxlZCIsIm1vZGlmaWVyTmFtZSIsInNvbWUiLCJuYW1lIiwiZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lIiwicHJlZml4ZXMiLCJ1cHBlclByb3AiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInByZWZpeCIsInRvQ2hlY2siLCJzdHlsZSIsImRlc3Ryb3kiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ3aWxsQ2hhbmdlIiwiZGlzYWJsZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlT25EZXN0cm95IiwicmVtb3ZlQ2hpbGQiLCJnZXRXaW5kb3ciLCJhdHRhY2hUb1Njcm9sbFBhcmVudHMiLCJldmVudCIsImNhbGxiYWNrIiwic2Nyb2xsUGFyZW50cyIsImlzQm9keSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicHVzaCIsInNldHVwRXZlbnRMaXN0ZW5lcnMiLCJ1cGRhdGVCb3VuZCIsInNjcm9sbEVsZW1lbnQiLCJldmVudHNFbmFibGVkIiwiZW5hYmxlRXZlbnRMaXN0ZW5lcnMiLCJzY2hlZHVsZVVwZGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiaXNOdW1lcmljIiwibiIsImlzTmFOIiwiaXNGaW5pdGUiLCJzZXRTdHlsZXMiLCJ1bml0Iiwic2V0QXR0cmlidXRlcyIsInNldEF0dHJpYnV0ZSIsImFwcGx5U3R5bGUiLCJhcnJvd0VsZW1lbnQiLCJhcHBseVN0eWxlT25Mb2FkIiwibW9kaWZpZXJPcHRpb25zIiwiZ2V0Um91bmRlZE9mZnNldHMiLCJzaG91bGRSb3VuZCIsIl9kYXRhJG9mZnNldHMiLCJyb3VuZCIsImZsb29yIiwibm9Sb3VuZCIsInYiLCJyZWZlcmVuY2VXaWR0aCIsInBvcHBlcldpZHRoIiwiaXNWZXJ0aWNhbCIsImlzVmFyaWF0aW9uIiwic2FtZVdpZHRoUGFyaXR5IiwiYm90aE9kZFdpZHRoIiwiaG9yaXpvbnRhbFRvSW50ZWdlciIsInZlcnRpY2FsVG9JbnRlZ2VyIiwiaXNGaXJlZm94IiwiY29tcHV0ZVN0eWxlIiwibGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uIiwiZ3B1QWNjZWxlcmF0aW9uIiwib2Zmc2V0UGFyZW50UmVjdCIsImRldmljZVBpeGVsUmF0aW8iLCJwcmVmaXhlZFByb3BlcnR5IiwiaW52ZXJ0VG9wIiwiaW52ZXJ0TGVmdCIsImFycm93IiwiaXNNb2RpZmllclJlcXVpcmVkIiwicmVxdWVzdGluZ05hbWUiLCJyZXF1ZXN0ZWROYW1lIiwicmVxdWVzdGluZyIsImlzUmVxdWlyZWQiLCJfcmVxdWVzdGluZyIsInJlcXVlc3RlZCIsIl9kYXRhJG9mZnNldHMkYXJyb3ciLCJxdWVyeVNlbGVjdG9yIiwibGVuIiwic2lkZUNhcGl0YWxpemVkIiwidG9Mb3dlckNhc2UiLCJhbHRTaWRlIiwib3BTaWRlIiwiYXJyb3dFbGVtZW50U2l6ZSIsImNlbnRlciIsInBvcHBlck1hcmdpblNpZGUiLCJwb3BwZXJCb3JkZXJTaWRlIiwic2lkZVZhbHVlIiwibWluIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb24iLCJwbGFjZW1lbnRzIiwidmFsaWRQbGFjZW1lbnRzIiwiY2xvY2t3aXNlIiwiY291bnRlciIsImluZGV4IiwiY29uY2F0IiwicmV2ZXJzZSIsIkJFSEFWSU9SUyIsIkZMSVAiLCJDTE9DS1dJU0UiLCJDT1VOVEVSQ0xPQ0tXSVNFIiwicGxhY2VtZW50T3Bwb3NpdGUiLCJmbGlwT3JkZXIiLCJiZWhhdmlvciIsInN0ZXAiLCJyZWZPZmZzZXRzIiwib3ZlcmxhcHNSZWYiLCJvdmVyZmxvd3NMZWZ0Iiwib3ZlcmZsb3dzUmlnaHQiLCJvdmVyZmxvd3NUb3AiLCJvdmVyZmxvd3NCb3R0b20iLCJvdmVyZmxvd3NCb3VuZGFyaWVzIiwiZmxpcHBlZFZhcmlhdGlvbkJ5UmVmIiwiZmxpcFZhcmlhdGlvbnMiLCJmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50IiwiZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQiLCJmbGlwcGVkVmFyaWF0aW9uIiwia2VlcFRvZ2V0aGVyIiwidG9WYWx1ZSIsInN0ciIsInNpemUiLCJwYXJzZU9mZnNldCIsImJhc2VQbGFjZW1lbnQiLCJ1c2VIZWlnaHQiLCJmcmFnbWVudHMiLCJmcmFnIiwidHJpbSIsImRpdmlkZXIiLCJzZWFyY2giLCJzcGxpdFJlZ2V4Iiwib3BzIiwib3AiLCJtZXJnZVdpdGhQcmV2aW91cyIsInJlZHVjZSIsImluZGV4MiIsInByZXZlbnRPdmVyZmxvdyIsInRyYW5zZm9ybVByb3AiLCJwb3BwZXJTdHlsZXMiLCJ0cmFuc2Zvcm0iLCJwcmlvcml0eSIsInByaW1hcnkiLCJlc2NhcGVXaXRoUmVmZXJlbmNlIiwic2Vjb25kYXJ5Iiwic2hpZnQiLCJzaGlmdHZhcmlhdGlvbiIsInNoaWZ0T2Zmc2V0cyIsImhpZGUiLCJib3VuZCIsImlubmVyIiwic3VidHJhY3RMZW5ndGgiLCJvbkxvYWQiLCJEZWZhdWx0cyIsIlBvcHBlciIsIl90aGlzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYmluZCIsImpxdWVyeSIsInVwZGF0ZSQkMSIsImRlc3Ryb3kkJDEiLCJlbmFibGVFdmVudExpc3RlbmVycyQkMSIsImRpc2FibGVFdmVudExpc3RlbmVycyQkMSIsIlV0aWxzIiwiZ2xvYmFsIiwiUG9wcGVyVXRpbHMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxJQUFJQSxZQUFZLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUMsT0FBT0MsUUFBUCxLQUFvQixXQUFyRCxJQUFvRSxPQUFPQyxTQUFQLEtBQXFCLFdBQXpHOztBQUVBLElBQUlDLGtCQUFrQixZQUFZO0FBQ2hDLE1BQUlDLHdCQUF3QixDQUFDLE1BQUQsRUFBUyxTQUFULEVBQW9CLFNBQXBCLENBQTVCO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELHNCQUFzQkUsTUFBMUMsRUFBa0RELEtBQUssQ0FBdkQsRUFBMEQ7QUFDeEQsUUFBSU4sYUFBYUcsVUFBVUssU0FBVixDQUFvQkMsT0FBcEIsQ0FBNEJKLHNCQUFzQkMsQ0FBdEIsQ0FBNUIsS0FBeUQsQ0FBMUUsRUFBNkU7QUFDM0UsYUFBTyxDQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU8sQ0FBUDtBQUNELENBUnFCLEVBQXRCOztBQVVBLFNBQVNJLGlCQUFULENBQTJCQyxFQUEzQixFQUErQjtBQUM3QixNQUFJQyxTQUFTLEtBQWI7QUFDQSxTQUFPLFlBQVk7QUFDakIsUUFBSUEsTUFBSixFQUFZO0FBQ1Y7QUFDRDtBQUNEQSxhQUFTLElBQVQ7QUFDQVgsV0FBT1ksT0FBUCxDQUFlQyxPQUFmLEdBQXlCQyxJQUF6QixDQUE4QixZQUFZO0FBQ3hDSCxlQUFTLEtBQVQ7QUFDQUQ7QUFDRCxLQUhEO0FBSUQsR0FURDtBQVVEOztBQUVELFNBQVNLLFlBQVQsQ0FBc0JMLEVBQXRCLEVBQTBCO0FBQ3hCLE1BQUlNLFlBQVks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KiBAZmlsZU92ZXJ2aWV3IEtpY2thc3MgbGlicmFyeSB0byBjcmVhdGUgYW5kIHBsYWNlIHBvcHBlcnMgbmVhciB0aGVpciByZWZlcmVuY2UgZWxlbWVudHMuXG4gKiBAdmVyc2lvbiAxLjE2LjFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmVkZXJpY28gWml2b2xvIGFuZCBjb250cmlidXRvcnNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJztcblxudmFyIHRpbWVvdXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxvbmdlclRpbWVvdXRCcm93c2VycyA9IFsnRWRnZScsICdUcmlkZW50JywgJ0ZpcmVmb3gnXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nZXJUaW1lb3V0QnJvd3NlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn0oKTtcblxuZnVuY3Rpb24gbWljcm90YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGZuKCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRhc2tEZWJvdW5jZShmbikge1xuICB2YXIgc2NoZWR1bGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzY2hlZHVsZWQpIHtcbiAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIGZuKCk7XG4gICAgICB9LCB0aW1lb3V0RHVyYXRpb24pO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHN1cHBvcnRzTWljcm9UYXNrcyA9IGlzQnJvd3NlciAmJiB3aW5kb3cuUHJvbWlzZTtcblxuLyoqXG4qIENyZWF0ZSBhIGRlYm91bmNlZCB2ZXJzaW9uIG9mIGEgbWV0aG9kLCB0aGF0J3MgYXN5bmNocm9ub3VzbHkgZGVmZXJyZWRcbiogYnV0IGNhbGxlZCBpbiB0aGUgbWluaW11bSB0aW1lIHBvc3NpYmxlLlxuKlxuKiBAbWV0aG9kXG4qIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiogQGFyZ3VtZW50IHtGdW5jdGlvbn0gZm5cbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbnZhciBkZWJvdW5jZSA9IHN1cHBvcnRzTWljcm9UYXNrcyA/IG1pY3JvdGFza0RlYm91bmNlIDogdGFza0RlYm91bmNlO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FueX0gZnVuY3Rpb25Ub0NoZWNrIC0gdmFyaWFibGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG86IGlzIGEgZnVuY3Rpb24/XG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuY3Rpb25Ub0NoZWNrKSB7XG4gIHZhciBnZXRUeXBlID0ge307XG4gIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogR2V0IENTUyBjb21wdXRlZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSBvYmplY3QsIG9yIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGl0c2VsZi5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSB7XG4gIHJldHVybiByZWZlcmVuY2UgJiYgcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgPyByZWZlcmVuY2UucmVmZXJlbmNlTm9kZSA6IHJlZmVyZW5jZTtcbn1cblxudmFyIGlzSUUxMSA9IGlzQnJvd3NlciAmJiAhISh3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcbnZhciBpc0lFMTAgPSBpc0Jyb3dzZXIgJiYgL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBpc0lFXG4gKi9cbmZ1bmN0aW9uIGlzSUUodmVyc2lvbikge1xuICBpZiAodmVyc2lvbiA9PT0gMTEpIHtcbiAgICByZXR1cm4gaXNJRTExO1xuICB9XG4gIGlmICh2ZXJzaW9uID09PSAxMCkge1xuICAgIHJldHVybiBpc0lFMTA7XG4gIH1cbiAgcmV0dXJuIGlzSUUxMSB8fCBpc0lFMTA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2Zmc2V0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgdmFyIG5vT2Zmc2V0UGFyZW50ID0gaXNJRSgxMCkgPyBkb2N1bWVudC5ib2R5IDogbnVsbDtcblxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgfHwgbnVsbDtcbiAgLy8gU2tpcCBoaWRkZW4gZWxlbWVudHMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBvZmZzZXRQYXJlbnRcbiAgd2hpbGUgKG9mZnNldFBhcmVudCA9PT0gbm9PZmZzZXRQYXJlbnQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSAoZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKS5vZmZzZXRQYXJlbnQ7XG4gIH1cblxuICB2YXIgbm9kZU5hbWUgPSBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50Lm5vZGVOYW1lO1xuXG4gIGlmICghbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gLm9mZnNldFBhcmVudCB3aWxsIHJldHVybiB0aGUgY2xvc2VzdCBUSCwgVEQgb3IgVEFCTEUgaW4gY2FzZVxuICAvLyBubyBvZmZzZXRQYXJlbnQgaXMgcHJlc2VudCwgSSBoYXRlIHRoaXMgam9iLi4uXG4gIGlmIChbJ1RIJywgJ1REJywgJ1RBQkxFJ10uaW5kZXhPZihvZmZzZXRQYXJlbnQubm9kZU5hbWUpICE9PSAtMSAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50O1xufVxuXG5mdW5jdGlvbiBpc09mZnNldENvbnRhaW5lcihlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnSFRNTCcgfHwgZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpID09PSBlbGVtZW50O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSByb290IG5vZGUgKGRvY3VtZW50LCBzaGFkb3dET00gcm9vdCkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge0VsZW1lbnR9IHJvb3Qgbm9kZVxuICovXG5mdW5jdGlvbiBnZXRSb290KG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBnZXRSb290KG5vZGUucGFyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb2Zmc2V0IHBhcmVudCBjb21tb24gdG8gdGhlIHR3byBwcm92aWRlZCBub2Rlc1xuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MVxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MlxuICogQHJldHVybnMge0VsZW1lbnR9IGNvbW1vbiBvZmZzZXQgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQxIHx8ICFlbGVtZW50MS5ub2RlVHlwZSB8fCAhZWxlbWVudDIgfHwgIWVsZW1lbnQyLm5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIEhlcmUgd2UgbWFrZSBzdXJlIHRvIGdpdmUgYXMgXCJzdGFydFwiIHRoZSBlbGVtZW50IHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTVxuICB2YXIgb3JkZXIgPSBlbGVtZW50MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50MikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORztcbiAgdmFyIHN0YXJ0ID0gb3JkZXIgPyBlbGVtZW50MSA6IGVsZW1lbnQyO1xuICB2YXIgZW5kID0gb3JkZXIgPyBlbGVtZW50MiA6IGVsZW1lbnQxO1xuXG4gIC8vIEdldCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldFN0YXJ0KHN0YXJ0LCAwKTtcbiAgcmFuZ2Uuc2V0RW5kKGVuZCwgMCk7XG4gIHZhciBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gIC8vIEJvdGggbm9kZXMgYXJlIGluc2lkZSAjZG9jdW1lbnRcblxuICBpZiAoZWxlbWVudDEgIT09IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyICYmIGVsZW1lbnQyICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciB8fCBzdGFydC5jb250YWlucyhlbmQpKSB7XG4gICAgaWYgKGlzT2Zmc2V0Q29udGFpbmVyKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkge1xuICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQoY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICB9XG5cbiAgLy8gb25lIG9mIHRoZSBub2RlcyBpcyBpbnNpZGUgc2hhZG93RE9NLCBmaW5kIHdoaWNoIG9uZVxuICB2YXIgZWxlbWVudDFyb290ID0gZ2V0Um9vdChlbGVtZW50MSk7XG4gIGlmIChlbGVtZW50MXJvb3QuaG9zdCkge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxcm9vdC5ob3N0LCBlbGVtZW50Mik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGdldFJvb3QoZWxlbWVudDIpLmhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiBzaWRlICh0b3AgYW5kIGxlZnQpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzaWRlIGB0b3BgIG9yIGBsZWZ0YFxuICogQHJldHVybnMge251bWJlcn0gYW1vdW50IG9mIHNjcm9sbGVkIHBpeGVsc1xuICovXG5mdW5jdGlvbiBnZXRTY3JvbGwoZWxlbWVudCkge1xuICB2YXIgc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3RvcCc7XG5cbiAgdmFyIHVwcGVyU2lkZSA9IHNpZGUgPT09ICd0b3AnID8gJ3Njcm9sbFRvcCcgOiAnc2Nyb2xsTGVmdCc7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGh0bWw7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnRbdXBwZXJTaWRlXTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50W3VwcGVyU2lkZV07XG59XG5cbi8qXG4gKiBTdW0gb3Igc3VidHJhY3QgdGhlIGVsZW1lbnQgc2Nyb2xsIHZhbHVlcyAobGVmdCBhbmQgdG9wKSBmcm9tIGEgZ2l2ZW4gcmVjdCBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0IC0gUmVjdCBvYmplY3QgeW91IHdhbnQgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB0aGUgZnVuY3Rpb24gcmVhZHMgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VidHJhY3QgLSBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdWJ0cmFjdCB0aGUgc2Nyb2xsIHZhbHVlc1xuICogQHJldHVybiB7T2JqZWN0fSByZWN0IC0gVGhlIG1vZGlmaWVyIHJlY3Qgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVTY3JvbGwocmVjdCwgZWxlbWVudCkge1xuICB2YXIgc3VidHJhY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICB2YXIgbW9kaWZpZXIgPSBzdWJ0cmFjdCA/IC0xIDogMTtcbiAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wICogbW9kaWZpZXI7XG4gIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdCAqIG1vZGlmaWVyO1xuICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbi8qXG4gKiBIZWxwZXIgdG8gZGV0ZWN0IGJvcmRlcnMgb2YgYSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xuICogUmVzdWx0IG9mIGBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHlgIG9uIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpcyAtIGB4YCBvciBgeWBcbiAqIEByZXR1cm4ge251bWJlcn0gYm9yZGVycyAtIFRoZSBib3JkZXJzIHNpemUgb2YgdGhlIGdpdmVuIGF4aXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsIGF4aXMpIHtcbiAgdmFyIHNpZGVBID0gYXhpcyA9PT0gJ3gnID8gJ0xlZnQnIDogJ1RvcCc7XG4gIHZhciBzaWRlQiA9IHNpZGVBID09PSAnTGVmdCcgPyAnUmlnaHQnIDogJ0JvdHRvbSc7XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUEgKyAnV2lkdGgnXSkgKyBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVCICsgJ1dpZHRoJ10pO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IHBhcnNlSW50KGh0bWxbJ29mZnNldCcgKyBheGlzXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ1RvcCcgOiAnTGVmdCcpXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ0JvdHRvbScgOiAnUmlnaHQnKV0pIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKGRvY3VtZW50KSB7XG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBjb21wdXRlZFN0eWxlID0gaXNJRSgxMCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZ2V0U2l6ZSgnSGVpZ2h0JywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSksXG4gICAgd2lkdGg6IGdldFNpemUoJ1dpZHRoJywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSlcbiAgfTtcbn1cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuXG5cblxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKipcbiAqIEdpdmVuIGVsZW1lbnQgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gb2Zmc2V0c1xuICogQHJldHVybnMge09iamVjdH0gQ2xpZW50UmVjdCBsaWtlIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0KG9mZnNldHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvZmZzZXRzLCB7XG4gICAgcmlnaHQ6IG9mZnNldHMubGVmdCArIG9mZnNldHMud2lkdGgsXG4gICAgYm90dG9tOiBvZmZzZXRzLnRvcCArIG9mZnNldHMuaGVpZ2h0XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBib3VuZGluZyBjbGllbnQgcmVjdCBvZiBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IGNsaWVudCByZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0ge307XG5cbiAgLy8gSUUxMCAxMCBGSVg6IFBsZWFzZSwgZG9uJ3QgYXNrLCB0aGUgZWxlbWVudCBpc24ndFxuICAvLyBjb25zaWRlcmVkIGluIERPTSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuLi5cbiAgLy8gVGhpcyBpc24ndCByZXByb2R1Y2libGUgaW4gSUUxMCBjb21wYXRpYmlsaXR5IG1vZGUgb2YgSUUxMVxuICB0cnkge1xuICAgIGlmIChpc0lFKDEwKSkge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gICAgICByZWN0LnRvcCArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdDtcbiAgICAgIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QucmlnaHQgKz0gc2Nyb2xsTGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3AsXG4gICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gIH07XG5cbiAgLy8gc3VidHJhY3Qgc2Nyb2xsYmFyIHNpemUgZnJvbSBzaXplc1xuICB2YXIgc2l6ZXMgPSBlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcgPyBnZXRXaW5kb3dTaXplcyhlbGVtZW50Lm93bmVyRG9jdW1lbnQpIDoge307XG4gIHZhciB3aWR0aCA9IHNpemVzLndpZHRoIHx8IGVsZW1lbnQuY2xpZW50V2lkdGggfHwgcmVzdWx0LndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5oZWlnaHQ7XG5cbiAgdmFyIGhvcml6U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIHdpZHRoO1xuICB2YXIgdmVydFNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVpZ2h0O1xuXG4gIC8vIGlmIGFuIGh5cG90aGV0aWNhbCBzY3JvbGxiYXIgaXMgZGV0ZWN0ZWQsIHdlIG11c3QgYmUgc3VyZSBpdCdzIG5vdCBhIGBib3JkZXJgXG4gIC8vIHdlIG1ha2UgdGhpcyBjaGVjayBjb25kaXRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICBpZiAoaG9yaXpTY3JvbGxiYXIgfHwgdmVydFNjcm9sbGJhcikge1xuICAgIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCk7XG4gICAgaG9yaXpTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneCcpO1xuICAgIHZlcnRTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneScpO1xuXG4gICAgcmVzdWx0LndpZHRoIC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIHJlc3VsdC5oZWlnaHQgLT0gdmVydFNjcm9sbGJhcjtcbiAgfVxuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShjaGlsZHJlbiwgcGFyZW50KSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaXNJRTEwID0gaXNJRSgxMCk7XG4gIHZhciBpc0hUTUwgPSBwYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJztcbiAgdmFyIGNoaWxkcmVuUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChjaGlsZHJlbik7XG4gIHZhciBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoY2hpbGRyZW4pO1xuXG4gIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50KTtcbiAgdmFyIGJvcmRlclRvcFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyVG9wV2lkdGgpO1xuICB2YXIgYm9yZGVyTGVmdFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyTGVmdFdpZHRoKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgaXNIVE1MKSB7XG4gICAgcGFyZW50UmVjdC50b3AgPSBNYXRoLm1heChwYXJlbnRSZWN0LnRvcCwgMCk7XG4gICAgcGFyZW50UmVjdC5sZWZ0ID0gTWF0aC5tYXgocGFyZW50UmVjdC5sZWZ0LCAwKTtcbiAgfVxuICB2YXIgb2Zmc2V0cyA9IGdldENsaWVudFJlY3Qoe1xuICAgIHRvcDogY2hpbGRyZW5SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wIC0gYm9yZGVyVG9wV2lkdGgsXG4gICAgbGVmdDogY2hpbGRyZW5SZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgLSBib3JkZXJMZWZ0V2lkdGgsXG4gICAgd2lkdGg6IGNoaWxkcmVuUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IGNoaWxkcmVuUmVjdC5oZWlnaHRcbiAgfSk7XG4gIG9mZnNldHMubWFyZ2luVG9wID0gMDtcbiAgb2Zmc2V0cy5tYXJnaW5MZWZ0ID0gMDtcblxuICAvLyBTdWJ0cmFjdCBtYXJnaW5zIG9mIGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGl0J3MgYmVpbmcgdXNlZCBhcyBwYXJlbnRcbiAgLy8gd2UgZG8gdGhpcyBvbmx5IG9uIEhUTUwgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IGVsZW1lbnQgdGhhdCBiZWhhdmVzXG4gIC8vIGRpZmZlcmVudGx5IHdoZW4gbWFyZ2lucyBhcmUgYXBwbGllZCB0byBpdC4gVGhlIG1hcmdpbnMgYXJlIGluY2x1ZGVkIGluXG4gIC8vIHRoZSBib3ggb2YgdGhlIGRvY3VtZW50RWxlbWVudCwgaW4gdGhlIG90aGVyIGNhc2VzIG5vdC5cbiAgaWYgKCFpc0lFMTAgJiYgaXNIVE1MKSB7XG4gICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcblxuICAgIG9mZnNldHMudG9wIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMuYm90dG9tIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubGVmdCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuICAgIG9mZnNldHMucmlnaHQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcblxuICAgIC8vIEF0dGFjaCBtYXJnaW5Ub3AgYW5kIG1hcmdpbkxlZnQgYmVjYXVzZSBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgbWF5IG5lZWQgdGhlbVxuICAgIG9mZnNldHMubWFyZ2luVG9wID0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XG4gIH1cblxuICBpZiAoaXNJRTEwICYmICFmaXhlZFBvc2l0aW9uID8gcGFyZW50LmNvbnRhaW5zKHNjcm9sbFBhcmVudCkgOiBwYXJlbnQgPT09IHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQubm9kZU5hbWUgIT09ICdCT0RZJykge1xuICAgIG9mZnNldHMgPSBpbmNsdWRlU2Nyb2xsKG9mZnNldHMsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlKGVsZW1lbnQpIHtcbiAgdmFyIGV4Y2x1ZGVTY3JvbGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGVsZW1lbnQsIGh0bWwpO1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChodG1sLmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGh0bWwuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG5cbiAgdmFyIHNjcm9sbFRvcCA9ICFleGNsdWRlU2Nyb2xsID8gZ2V0U2Nyb2xsKGh0bWwpIDogMDtcbiAgdmFyIHNjcm9sbExlZnQgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sLCAnbGVmdCcpIDogMDtcblxuICB2YXIgb2Zmc2V0ID0ge1xuICAgIHRvcDogc2Nyb2xsVG9wIC0gcmVsYXRpdmVPZmZzZXQudG9wICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luVG9wLFxuICAgIGxlZnQ6IHNjcm9sbExlZnQgLSByZWxhdGl2ZU9mZnNldC5sZWZ0ICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luTGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChvZmZzZXQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGN1c3RvbUNvbnRhaW5lclxuICogQHJldHVybnMge0Jvb2xlYW59IGFuc3dlciB0byBcImlzRml4ZWQ/XCJcbiAqL1xuZnVuY3Rpb24gaXNGaXhlZChlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc0ZpeGVkKHBhcmVudE5vZGUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgYW4gZWxlbWVudCB0aGF0IGhhcyBhIHRyYW5zZm9ybWVkIHByb3BlcnR5IGRlZmluZWRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IGZpcnN0IHRyYW5zZm9ybWVkIHBhcmVudCBvciBkb2N1bWVudEVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgZXJyb3JzIGluIGNhc2Ugb25lIG9mIHRoZSBlbGVtZW50cyBpc24ndCBkZWZpbmVkIGZvciBhbnkgcmVhc29uXG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnRFbGVtZW50IHx8IGlzSUUoKSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIGVsID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoZWwgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsLCAndHJhbnNmb3JtJykgPT09ICdub25lJykge1xuICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIENvbXB1dGVkIHRoZSBib3VuZGFyaWVzIGxpbWl0cyBhbmQgcmV0dXJuIHRoZW1cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZ1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQgLSBFbGVtZW50IHVzZWQgdG8gZGVmaW5lIHRoZSBib3VuZGFyaWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGZpeGVkUG9zaXRpb24gLSBJcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBDb29yZGluYXRlcyBvZiB0aGUgYm91bmRhcmllc1xuICovXG5mdW5jdGlvbiBnZXRCb3VuZGFyaWVzKHBvcHBlciwgcmVmZXJlbmNlLCBwYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcblxuICB2YXIgYm91bmRhcmllcyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG5cbiAgLy8gSGFuZGxlIHZpZXdwb3J0IGNhc2VcbiAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgYm91bmRhcmllcyA9IGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIEhhbmRsZSBvdGhlciBjYXNlcyBiYXNlZCBvbiBET00gZWxlbWVudCB1c2VkIGFzIGJvdW5kYXJpZXNcbiAgICB2YXIgYm91bmRhcmllc05vZGUgPSB2b2lkIDA7XG4gICAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShyZWZlcmVuY2UpKTtcbiAgICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgIGJvdW5kYXJpZXNOb2RlID0gcG9wcGVyLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICd3aW5kb3cnKSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBib3VuZGFyaWVzRWxlbWVudDtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0cyA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShib3VuZGFyaWVzTm9kZSwgb2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcblxuICAgIC8vIEluIGNhc2Ugb2YgSFRNTCwgd2UgbmVlZCBhIGRpZmZlcmVudCBjb21wdXRhdGlvblxuICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnICYmICFpc0ZpeGVkKG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBfZ2V0V2luZG93U2l6ZXMgPSBnZXRXaW5kb3dTaXplcyhwb3BwZXIub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldFdpbmRvd1NpemVzLmhlaWdodCxcbiAgICAgICAgICB3aWR0aCA9IF9nZXRXaW5kb3dTaXplcy53aWR0aDtcblxuICAgICAgYm91bmRhcmllcy50b3AgKz0gb2Zmc2V0cy50b3AgLSBvZmZzZXRzLm1hcmdpblRvcDtcbiAgICAgIGJvdW5kYXJpZXMuYm90dG9tID0gaGVpZ2h0ICsgb2Zmc2V0cy50b3A7XG4gICAgICBib3VuZGFyaWVzLmxlZnQgKz0gb2Zmc2V0cy5sZWZ0IC0gb2Zmc2V0cy5tYXJnaW5MZWZ0O1xuICAgICAgYm91bmRhcmllcy5yaWdodCA9IHdpZHRoICsgb2Zmc2V0cy5sZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3IgYWxsIHRoZSBvdGhlciBET00gZWxlbWVudHMsIHRoaXMgb25lIGlzIGdvb2RcbiAgICAgIGJvdW5kYXJpZXMgPSBvZmZzZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBwYWRkaW5nc1xuICBwYWRkaW5nID0gcGFkZGluZyB8fCAwO1xuICB2YXIgaXNQYWRkaW5nTnVtYmVyID0gdHlwZW9mIHBhZGRpbmcgPT09ICdudW1iZXInO1xuICBib3VuZGFyaWVzLmxlZnQgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcubGVmdCB8fCAwO1xuICBib3VuZGFyaWVzLnRvcCArPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy50b3AgfHwgMDtcbiAgYm91bmRhcmllcy5yaWdodCAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5yaWdodCB8fCAwO1xuICBib3VuZGFyaWVzLmJvdHRvbSAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5ib3R0b20gfHwgMDtcblxuICByZXR1cm4gYm91bmRhcmllcztcbn1cblxuZnVuY3Rpb24gZ2V0QXJlYShfcmVmKSB7XG4gIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggKiBoZWlnaHQ7XG59XG5cbi8qKlxuICogVXRpbGl0eSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgYGF1dG9gIHBsYWNlbWVudCB0byB0aGUgcGxhY2VtZW50IHdpdGggbW9yZVxuICogYXZhaWxhYmxlIHNwYWNlLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQocGxhY2VtZW50LCByZWZSZWN0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDA7XG5cbiAgaWYgKHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gIHZhciByZWN0cyA9IHtcbiAgICB0b3A6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWZSZWN0LnRvcCAtIGJvdW5kYXJpZXMudG9wXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMucmlnaHQgLSByZWZSZWN0LnJpZ2h0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5ib3R0b20gLSByZWZSZWN0LmJvdHRvbVxuICAgIH0sXG4gICAgbGVmdDoge1xuICAgICAgd2lkdGg6IHJlZlJlY3QubGVmdCAtIGJvdW5kYXJpZXMubGVmdCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNvcnRlZEFyZWFzID0gT2JqZWN0LmtleXMocmVjdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgcmVjdHNba2V5XSwge1xuICAgICAgYXJlYTogZ2V0QXJlYShyZWN0c1trZXldKVxuICAgIH0pO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbiAgfSk7XG5cbiAgdmFyIGZpbHRlcmVkQXJlYXMgPSBzb3J0ZWRBcmVhcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICByZXR1cm4gd2lkdGggPj0gcG9wcGVyLmNsaWVudFdpZHRoICYmIGhlaWdodCA+PSBwb3BwZXIuY2xpZW50SGVpZ2h0O1xuICB9KTtcblxuICB2YXIgY29tcHV0ZWRQbGFjZW1lbnQgPSBmaWx0ZXJlZEFyZWFzLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEFyZWFzWzBdLmtleSA6IHNvcnRlZEFyZWFzWzBdLmtleTtcblxuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgcmV0dXJuIGNvbXB1dGVkUGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcbn1cblxuLyoqXG4gKiBHZXQgb2Zmc2V0cyB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtFbGVtZW50fSBwb3BwZXIgLSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gcmVmZXJlbmNlIC0gdGhlIHJlZmVyZW5jZSBlbGVtZW50ICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEBwYXJhbSB7RWxlbWVudH0gZml4ZWRQb3NpdGlvbiAtIGlzIGluIGZpeGVkIHBvc2l0aW9uIG1vZGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlKSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHZhciBjb21tb25PZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG4gIHJldHVybiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUocmVmZXJlbmNlLCBjb21tb25PZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3V0ZXIgc2l6ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG9mZnNldCBzaXplICsgbWFyZ2lucylcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldE91dGVyU2l6ZXMoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wIHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luQm90dG9tIHx8IDApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCB8fCAwKTtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCArIHksXG4gICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCArIHhcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudFxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgdmFyIGhhc2ggPSB7IGxlZnQ6ICdyaWdodCcsIHJpZ2h0OiAnbGVmdCcsIGJvdHRvbTogJ3RvcCcsIHRvcDogJ2JvdHRvbScgfTtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gQ1NTIHBvc2l0aW9uIHRoZSBQb3BwZXIgd2lsbCBnZXQgYXBwbGllZFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0cyAtIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGxhY2VtZW50IC0gb25lIG9mIHRoZSB2YWxpZCBwbGFjZW1lbnQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gcG9wcGVyT2Zmc2V0cyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFBvcHBlck9mZnNldHMocG9wcGVyLCByZWZlcmVuY2VPZmZzZXRzLCBwbGFjZW1lbnQpIHtcbiAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgLy8gR2V0IHBvcHBlciBub2RlIHNpemVzXG4gIHZhciBwb3BwZXJSZWN0ID0gZ2V0T3V0ZXJTaXplcyhwb3BwZXIpO1xuXG4gIC8vIEFkZCBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3RcbiAgdmFyIHBvcHBlck9mZnNldHMgPSB7XG4gICAgd2lkdGg6IHBvcHBlclJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBwb3BwZXJSZWN0LmhlaWdodFxuICB9O1xuXG4gIC8vIGRlcGVuZGluZyBieSB0aGUgcG9wcGVyIHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgdmFyIGlzSG9yaXogPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgbWFpblNpZGUgPSBpc0hvcml6ID8gJ3RvcCcgOiAnbGVmdCc7XG4gIHZhciBzZWNvbmRhcnlTaWRlID0gaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc0hvcml6ID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2Vjb25kYXJ5TWVhc3VyZW1lbnQgPSAhaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBwb3BwZXJPZmZzZXRzW21haW5TaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbbWFpblNpZGVdICsgcmVmZXJlbmNlT2Zmc2V0c1ttZWFzdXJlbWVudF0gLyAyIC0gcG9wcGVyUmVjdFttZWFzdXJlbWVudF0gLyAyO1xuICBpZiAocGxhY2VtZW50ID09PSBzZWNvbmRhcnlTaWRlKSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gLSBwb3BwZXJSZWN0W3NlY29uZGFyeU1lYXN1cmVtZW50XTtcbiAgfSBlbHNlIHtcbiAgICBwb3BwZXJPZmZzZXRzW3NlY29uZGFyeVNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1tnZXRPcHBvc2l0ZVBsYWNlbWVudChzZWNvbmRhcnlTaWRlKV07XG4gIH1cblxuICByZXR1cm4gcG9wcGVyT2Zmc2V0cztcbn1cblxuLyoqXG4gKiBNaW1pY3MgdGhlIGBmaW5kYCBtZXRob2Qgb2YgQXJyYXlcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZChhcnIsIGNoZWNrKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZCBpZiBzdXBwb3J0ZWRcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgcmV0dXJuIGFyci5maW5kKGNoZWNrKTtcbiAgfVxuXG4gIC8vIHVzZSBgZmlsdGVyYCB0byBvYnRhaW4gdGhlIHNhbWUgYmVoYXZpb3Igb2YgYGZpbmRgXG4gIHJldHVybiBhcnIuZmlsdGVyKGNoZWNrKVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtYXRjaGluZyBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFyciwgcHJvcCwgdmFsdWUpIHtcbiAgLy8gdXNlIG5hdGl2ZSBmaW5kSW5kZXggaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KSB7XG4gICAgcmV0dXJuIGFyci5maW5kSW5kZXgoZnVuY3Rpb24gKGN1cikge1xuICAgICAgcmV0dXJuIGN1cltwcm9wXSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyB1c2UgYGZpbmRgICsgYGluZGV4T2ZgIGlmIGBmaW5kSW5kZXhgIGlzbid0IHN1cHBvcnRlZFxuICB2YXIgbWF0Y2ggPSBmaW5kKGFyciwgZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmpbcHJvcF0gPT09IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIGFyci5pbmRleE9mKG1hdGNoKTtcbn1cblxuLyoqXG4gKiBMb29wIHRyb3VnaCB0aGUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIHJ1biB0aGVtIGluIG9yZGVyLFxuICogZWFjaCBvZiB0aGVtIHdpbGwgdGhlbiBlZGl0IHRoZSBkYXRhIG9iamVjdC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5kcyAtIE9wdGlvbmFsIG1vZGlmaWVyIG5hbWUgdXNlZCBhcyBzdG9wcGVyXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH1cbiAqL1xuZnVuY3Rpb24gcnVuTW9kaWZpZXJzKG1vZGlmaWVycywgZGF0YSwgZW5kcykge1xuICB2YXIgbW9kaWZpZXJzVG9SdW4gPSBlbmRzID09PSB1bmRlZmluZWQgPyBtb2RpZmllcnMgOiBtb2RpZmllcnMuc2xpY2UoMCwgZmluZEluZGV4KG1vZGlmaWVycywgJ25hbWUnLCBlbmRzKSk7XG5cbiAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXJbJ2Z1bmN0aW9uJ10pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ2Btb2RpZmllci5mdW5jdGlvbmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBtb2RpZmllci5mbmAhJyk7XG4gICAgfVxuICAgIHZhciBmbiA9IG1vZGlmaWVyWydmdW5jdGlvbiddIHx8IG1vZGlmaWVyLmZuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgIGlmIChtb2RpZmllci5lbmFibGVkICYmIGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAvLyBBZGQgcHJvcGVydGllcyB0byBvZmZzZXRzIHRvIG1ha2UgdGhlbSBhIGNvbXBsZXRlIGNsaWVudFJlY3Qgb2JqZWN0XG4gICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBlYWNoIG1vZGlmaWVyIHRvIG1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgb25lIGRvZXNuJ3RcbiAgICAgIC8vIG1lc3Mgd2l0aCB0aGVzZSB2YWx1ZXNcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuICAgICAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSk7XG5cbiAgICAgIGRhdGEgPSBmbihkYXRhLCBtb2RpZmllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wcGVyLCBjb21wdXRpbmcgdGhlIG5ldyBvZmZzZXRzIGFuZCBhcHBseWluZ1xuICogdGhlIG5ldyBzdHlsZS48YnIgLz5cbiAqIFByZWZlciBgc2NoZWR1bGVVcGRhdGVgIG92ZXIgYHVwZGF0ZWAgYmVjYXVzZSBvZiBwZXJmb3JtYW5jZSByZWFzb25zLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiB1cGRhdGUoKSB7XG4gIC8vIGlmIHBvcHBlciBpcyBkZXN0cm95ZWQsIGRvbid0IHBlcmZvcm0gYW55IGZ1cnRoZXIgdXBkYXRlXG4gIGlmICh0aGlzLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRhdGEgPSB7XG4gICAgaW5zdGFuY2U6IHRoaXMsXG4gICAgc3R5bGVzOiB7fSxcbiAgICBhcnJvd1N0eWxlczoge30sXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgZmxpcHBlZDogZmFsc2UsXG4gICAgb2Zmc2V0czoge31cbiAgfTtcblxuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZU9mZnNldHModGhpcy5zdGF0ZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIGRhdGEucGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQodGhpcy5vcHRpb25zLnBsYWNlbWVudCwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICAvLyBzdG9yZSB0aGUgY29tcHV0ZWQgcGxhY2VtZW50IGluc2lkZSBgb3JpZ2luYWxQbGFjZW1lbnRgXG4gIGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcblxuICBkYXRhLnBvc2l0aW9uRml4ZWQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZDtcblxuICAvLyBjb21wdXRlIHRoZSBwb3BwZXIgb2Zmc2V0c1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0UG9wcGVyT2Zmc2V0cyh0aGlzLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnO1xuXG4gIC8vIHJ1biB0aGUgbW9kaWZpZXJzXG4gIGRhdGEgPSBydW5Nb2RpZmllcnModGhpcy5tb2RpZmllcnMsIGRhdGEpO1xuXG4gIC8vIHRoZSBmaXJzdCBgdXBkYXRlYCB3aWxsIGNhbGwgYG9uQ3JlYXRlYCBjYWxsYmFja1xuICAvLyB0aGUgb3RoZXIgb25lcyB3aWxsIGNhbGwgYG9uVXBkYXRlYCBjYWxsYmFja1xuICBpZiAoIXRoaXMuc3RhdGUuaXNDcmVhdGVkKSB7XG4gICAgdGhpcy5zdGF0ZS5pc0NyZWF0ZWQgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMub25VcGRhdGUoZGF0YSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBpcyBlbmFibGVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTW9kaWZpZXJFbmFibGVkKG1vZGlmaWVycywgbW9kaWZpZXJOYW1lKSB7XG4gIHJldHVybiBtb2RpZmllcnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICBlbmFibGVkID0gX3JlZi5lbmFibGVkO1xuICAgIHJldHVybiBlbmFibGVkICYmIG5hbWUgPT09IG1vZGlmaWVyTmFtZTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmaXhlZCBzdXBwb3J0ZWQgcHJvcGVydHkgbmFtZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5IChjYW1lbENhc2UpXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBwcmVmaXhlZCBwcm9wZXJ0eSAoY2FtZWxDYXNlIG9yIFBhc2NhbENhc2UsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIHByZWZpeClcbiAqL1xuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKHByb3BlcnR5KSB7XG4gIHZhciBwcmVmaXhlcyA9IFtmYWxzZSwgJ21zJywgJ1dlYmtpdCcsICdNb3onLCAnTyddO1xuICB2YXIgdXBwZXJQcm9wID0gcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgIHZhciB0b0NoZWNrID0gcHJlZml4ID8gJycgKyBwcmVmaXggKyB1cHBlclByb3AgOiBwcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIHBvcHBlci5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgLy8gdG91Y2ggRE9NIG9ubHkgaWYgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGlzIGVuYWJsZWRcbiAgaWYgKGlzTW9kaWZpZXJFbmFibGVkKHRoaXMubW9kaWZpZXJzLCAnYXBwbHlTdHlsZScpKSB7XG4gICAgdGhpcy5wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUudG9wID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUubGVmdCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnJpZ2h0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlW2dldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyldID0gJyc7XG4gIH1cblxuICB0aGlzLmRpc2FibGVFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIHJlbW92ZSB0aGUgcG9wcGVyIGlmIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgdGhlIGRlbGV0aW9uIG9uIGRlc3Ryb3lcbiAgLy8gZG8gbm90IHVzZSBgcmVtb3ZlYCBiZWNhdXNlIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0XG4gIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlT25EZXN0cm95KSB7XG4gICAgdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlcik7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogR2V0IHRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtZW50KSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhzY3JvbGxQYXJlbnQsIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cykge1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50Lm5vZGVOYW1lID09PSAnQk9EWSc7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBzY3JvbGxQYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHNjcm9sbFBhcmVudDtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgaWYgKCFpc0JvZHkpIHtcbiAgICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoZ2V0U2Nyb2xsUGFyZW50KHRhcmdldC5wYXJlbnROb2RlKSwgZXZlbnQsIGNhbGxiYWNrLCBzY3JvbGxQYXJlbnRzKTtcbiAgfVxuICBzY3JvbGxQYXJlbnRzLnB1c2godGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBvcHRpb25zLCBzdGF0ZSwgdXBkYXRlQm91bmQpIHtcbiAgLy8gUmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBzdGF0ZS51cGRhdGVCb3VuZCA9IHVwZGF0ZUJvdW5kO1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICB2YXIgc2Nyb2xsRWxlbWVudCA9IGdldFNjcm9sbFBhcmVudChyZWZlcmVuY2UpO1xuICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsRWxlbWVudCwgJ3Njcm9sbCcsIHN0YXRlLnVwZGF0ZUJvdW5kLCBzdGF0ZS5zY3JvbGxQYXJlbnRzKTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQ7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIGFkZCByZXNpemUvc2Nyb2xsIGV2ZW50cyBhbmQgc3RhcnQgcmVjYWxjdWxhdGluZ1xuICogcG9zaXRpb24gb2YgdGhlIHBvcHBlciBlbGVtZW50IHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKCF0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc2V0dXBFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLCB0aGlzLnN0YXRlLCB0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBzdGF0ZSkge1xuICAvLyBSZW1vdmUgcmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG5cbiAgLy8gUmVtb3ZlIHNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICBzdGF0ZS5zY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG4gIH0pO1xuXG4gIC8vIFJlc2V0IHN0YXRlXG4gIHN0YXRlLnVwZGF0ZUJvdW5kID0gbnVsbDtcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IFtdO1xuICBzdGF0ZS5zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGZhbHNlO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCByZW1vdmUgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHdvbid0IHJlY2FsY3VsYXRlIHBvcHBlciBwb3NpdGlvblxuICogd2hlbiB0aGV5IGFyZSB0cmlnZ2VyZWQuIEl0IGFsc28gd29uJ3QgdHJpZ2dlciBgb25VcGRhdGVgIGNhbGxiYWNrIGFueW1vcmUsXG4gKiB1bmxlc3MgeW91IGNhbGwgYHVwZGF0ZWAgbWV0aG9kIG1hbnVhbGx5LlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICh0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgICB0aGlzLnN0YXRlID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMuc3RhdGUpO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgaWYgYSBnaXZlbiBpbnB1dCBpcyBhIG51bWJlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHsqfSBpbnB1dCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuIG4gIT09ICcnICYmICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB1bml0ID0gJyc7XG4gICAgLy8gYWRkIHVuaXQgaWYgdGhlIHZhbHVlIGlzIG51bWVyaWMgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gICAgaWYgKFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLmluZGV4T2YocHJvcCkgIT09IC0xICYmIGlzTnVtZXJpYyhzdHlsZXNbcHJvcF0pKSB7XG4gICAgICB1bml0ID0gJ3B4JztcbiAgICB9XG4gICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGVzIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbcHJvcF07XG4gICAgaWYgKHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcCwgYXR0cmlidXRlc1twcm9wXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5zdHlsZXMgLSBMaXN0IG9mIHN0eWxlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLmF0dHJpYnV0ZXMgLSBMaXN0IG9mIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBkYXRhIG9iamVjdFxuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlKGRhdGEpIHtcbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuc3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gaW4gdGhpcyB3YXkgd2UgY2FuIG1ha2UgdGhlIDNyZCBwYXJ0eSBtb2RpZmllcnMgYWRkIGN1c3RvbSBzdHlsZXMgdG8gaXRcbiAgLy8gQmUgYXdhcmUsIG1vZGlmaWVycyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91c1xuICAvLyBsaW5lcyBvZiB0aGlzIG1vZGlmaWVyIVxuICBzZXRTdHlsZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuc3R5bGVzKTtcblxuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5hdHRyaWJ1dGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gdGhleSB3aWxsIGJlIHNldCBhcyBIVE1MIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnRcbiAgc2V0QXR0cmlidXRlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgZGVmaW5lZCBhbmQgYXJyb3dTdHlsZXMgaGFzIHNvbWUgcHJvcGVydGllc1xuICBpZiAoZGF0YS5hcnJvd0VsZW1lbnQgJiYgT2JqZWN0LmtleXMoZGF0YS5hcnJvd1N0eWxlcykubGVuZ3RoKSB7XG4gICAgc2V0U3R5bGVzKGRhdGEuYXJyb3dFbGVtZW50LCBkYXRhLmFycm93U3R5bGVzKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNldCB0aGUgeC1wbGFjZW1lbnQgYXR0cmlidXRlIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UgYmVjYXVzZSBpdCBjb3VsZCBiZSB1c2VkXG4gKiB0byBhZGQgbWFyZ2lucyB0byB0aGUgcG9wcGVyIG1hcmdpbnMgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB0byBnZXQgdGhlXG4gKiBjb3JyZWN0IHBvcHBlciBvZmZzZXRzLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUG9wcGVyLmpzIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZU9uTG9hZChyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBzdGF0ZSkge1xuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgdmFyIHJlZmVyZW5jZU9mZnNldHMgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBjb21wdXRlIGF1dG8gcGxhY2VtZW50LCBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCxcbiAgLy8gbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAvLyBhbmQgcmVmZXIgdG8gb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgdmFyIHBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KG9wdGlvbnMucGxhY2VtZW50LCByZWZlcmVuY2VPZmZzZXRzLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICBwb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIHBsYWNlbWVudCk7XG5cbiAgLy8gQXBwbHkgYHBvc2l0aW9uYCB0byBwb3BwZXIgYmVmb3JlIGFueXRoaW5nIGVsc2UgYmVjYXVzZVxuICAvLyB3aXRob3V0IHRoZSBwb3NpdGlvbiBhcHBsaWVkIHdlIGNhbid0IGd1YXJhbnRlZSBjb3JyZWN0IGNvbXB1dGF0aW9uc1xuICBzZXRTdHlsZXMocG9wcGVyLCB7IHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJyB9KTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gc2hvdWxkUm91bmQgLSBJZiB0aGUgb2Zmc2V0cyBzaG91bGQgYmUgcm91bmRlZCBhdCBhbGxcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwb3BwZXIncyBwb3NpdGlvbiBvZmZzZXRzIHJvdW5kZWRcbiAqXG4gKiBUaGUgdGFsZSBvZiBwaXhlbC1wZXJmZWN0IHBvc2l0aW9uaW5nLiBJdCdzIHN0aWxsIG5vdCAxMDAlIHBlcmZlY3QsIGJ1dCBhc1xuICogZ29vZCBhcyBpdCBjYW4gYmUgd2l0aGluIHJlYXNvbi5cbiAqIERpc2N1c3Npb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL0ZlelZyYXN0YS9wb3BwZXIuanMvcHVsbC83MTVcbiAqXG4gKiBMb3cgRFBJIHNjcmVlbnMgY2F1c2UgYSBwb3BwZXIgdG8gYmUgYmx1cnJ5IGlmIG5vdCB1c2luZyBmdWxsIHBpeGVscyAoU2FmYXJpXG4gKiBhcyB3ZWxsIG9uIEhpZ2ggRFBJIHNjcmVlbnMpLlxuICpcbiAqIEZpcmVmb3ggcHJlZmVycyBubyByb3VuZGluZyBmb3IgcG9zaXRpb25pbmcgYW5kIGRvZXMgbm90IGhhdmUgYmx1cnJpbmVzcyBvblxuICogaGlnaCBEUEkgc2NyZWVucy5cbiAqXG4gKiBPbmx5IGhvcml6b250YWwgcGxhY2VtZW50IGFuZCBsZWZ0L3JpZ2h0IHZhbHVlcyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHNob3VsZFJvdW5kKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICB2YXIgbm9Sb3VuZCA9IGZ1bmN0aW9uIG5vUm91bmQodikge1xuICAgIHJldHVybiB2O1xuICB9O1xuXG4gIHZhciByZWZlcmVuY2VXaWR0aCA9IHJvdW5kKHJlZmVyZW5jZS53aWR0aCk7XG4gIHZhciBwb3BwZXJXaWR0aCA9IHJvdW5kKHBvcHBlci53aWR0aCk7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRhdGEucGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBpc1ZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LmluZGV4T2YoJy0nKSAhPT0gLTE7XG4gIHZhciBzYW1lV2lkdGhQYXJpdHkgPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IHBvcHBlcldpZHRoICUgMjtcbiAgdmFyIGJvdGhPZGRXaWR0aCA9IHJlZmVyZW5jZVdpZHRoICUgMiA9PT0gMSAmJiBwb3BwZXJXaWR0aCAlIDIgPT09IDE7XG5cbiAgdmFyIGhvcml6b250YWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogaXNWZXJ0aWNhbCB8fCBpc1ZhcmlhdGlvbiB8fCBzYW1lV2lkdGhQYXJpdHkgPyByb3VuZCA6IGZsb29yO1xuICB2YXIgdmVydGljYWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogcm91bmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBob3Jpem9udGFsVG9JbnRlZ2VyKGJvdGhPZGRXaWR0aCAmJiAhaXNWYXJpYXRpb24gJiYgc2hvdWxkUm91bmQgPyBwb3BwZXIubGVmdCAtIDEgOiBwb3BwZXIubGVmdCksXG4gICAgdG9wOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIudG9wKSxcbiAgICBib3R0b206IHZlcnRpY2FsVG9JbnRlZ2VyKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBob3Jpem9udGFsVG9JbnRlZ2VyKHBvcHBlci5yaWdodClcbiAgfTtcbn1cblxudmFyIGlzRmlyZWZveCA9IGlzQnJvd3NlciAmJiAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZShkYXRhLCBvcHRpb25zKSB7XG4gIHZhciB4ID0gb3B0aW9ucy54LFxuICAgICAgeSA9IG9wdGlvbnMueTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgLy8gUmVtb3ZlIHRoaXMgbGVnYWN5IHN1cHBvcnQgaW4gUG9wcGVyLmpzIHYyXG5cbiAgdmFyIGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAnYXBwbHlTdHlsZSc7XG4gIH0pLmdwdUFjY2VsZXJhdGlvbjtcbiAgaWYgKGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBgZ3B1QWNjZWxlcmF0aW9uYCBvcHRpb24gbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXIgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUG9wcGVyLmpzIScpO1xuICB9XG4gIHZhciBncHVBY2NlbGVyYXRpb24gPSBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCA/IGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA6IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uO1xuXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuXG4gIC8vIFN0eWxlc1xuICB2YXIgc3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiBwb3BwZXIucG9zaXRpb25cbiAgfTtcblxuICB2YXIgb2Zmc2V0cyA9IGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDwgMiB8fCAhaXNGaXJlZm94KTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICAvLyB3aGVuIG9mZnNldFBhcmVudCBpcyA8aHRtbD4gdGhlIHBvc2l0aW9uaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiAoZXhjbHVkaW5nIHRoZSBzY3JvbGxiYXIpXG4gICAgLy8gYW5kIG5vdCB0aGUgYm90dG9tIG9mIHRoZSBodG1sIGVsZW1lbnRcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0ICsgb2Zmc2V0cy5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnRSZWN0LmhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IC1vZmZzZXRQYXJlbnRSZWN0LndpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVmdCA9IG9mZnNldHMubGVmdDtcbiAgfVxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uICYmIHByZWZpeGVkUHJvcGVydHkpIHtcbiAgICBzdHlsZXNbcHJlZml4ZWRQcm9wZXJ0eV0gPSAndHJhbnNsYXRlM2QoJyArIGxlZnQgKyAncHgsICcgKyB0b3AgKyAncHgsIDApJztcbiAgICBzdHlsZXNbc2lkZUFdID0gMDtcbiAgICBzdHlsZXNbc2lkZUJdID0gMDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9ICd0cmFuc2Zvcm0nO1xuICB9IGVsc2Uge1xuICAgIC8vIG90aHdlcmlzZSwgd2UgdXNlIHRoZSBzdGFuZGFyZCBgdG9wYCwgYGxlZnRgLCBgYm90dG9tYCBhbmQgYHJpZ2h0YCBwcm9wZXJ0aWVzXG4gICAgdmFyIGludmVydFRvcCA9IHNpZGVBID09PSAnYm90dG9tJyA/IC0xIDogMTtcbiAgICB2YXIgaW52ZXJ0TGVmdCA9IHNpZGVCID09PSAncmlnaHQnID8gLTEgOiAxO1xuICAgIHN0eWxlc1tzaWRlQV0gPSB0b3AgKiBpbnZlcnRUb3A7XG4gICAgc3R5bGVzW3NpZGVCXSA9IGxlZnQgKiBpbnZlcnRMZWZ0O1xuICAgIHN0eWxlcy53aWxsQ2hhbmdlID0gc2lkZUEgKyAnLCAnICsgc2lkZUI7XG4gIH1cblxuICAvLyBBdHRyaWJ1dGVzXG4gIHZhciBhdHRyaWJ1dGVzID0ge1xuICAgICd4LXBsYWNlbWVudCc6IGRhdGEucGxhY2VtZW50XG4gIH07XG5cbiAgLy8gVXBkYXRlIGBkYXRhYCBhdHRyaWJ1dGVzLCBzdHlsZXMgYW5kIGFycm93U3R5bGVzXG4gIGRhdGEuYXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBhdHRyaWJ1dGVzLCBkYXRhLmF0dHJpYnV0ZXMpO1xuICBkYXRhLnN0eWxlcyA9IF9leHRlbmRzKHt9LCBzdHlsZXMsIGRhdGEuc3R5bGVzKTtcbiAgZGF0YS5hcnJvd1N0eWxlcyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMuYXJyb3csIGRhdGEuYXJyb3dTdHlsZXMpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGRlcGVuZHMgZnJvbSBhbm90aGVyIG9uZS48YnIgLz5cbiAqIEl0IGNoZWNrcyBpZiB0aGUgbmVlZGVkIG1vZGlmaWVyIGlzIGxpc3RlZCBhbmQgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVycyAtIGxpc3Qgb2YgbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGluZ05hbWUgLSBuYW1lIG9mIHJlcXVlc3RpbmcgbW9kaWZpZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0ZWROYW1lIC0gbmFtZSBvZiByZXF1ZXN0ZWQgbW9kaWZpZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyUmVxdWlyZWQobW9kaWZpZXJzLCByZXF1ZXN0aW5nTmFtZSwgcmVxdWVzdGVkTmFtZSkge1xuICB2YXIgcmVxdWVzdGluZyA9IGZpbmQobW9kaWZpZXJzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgIHJldHVybiBuYW1lID09PSByZXF1ZXN0aW5nTmFtZTtcbiAgfSk7XG5cbiAgdmFyIGlzUmVxdWlyZWQgPSAhIXJlcXVlc3RpbmcgJiYgbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09IHJlcXVlc3RlZE5hbWUgJiYgbW9kaWZpZXIuZW5hYmxlZCAmJiBtb2RpZmllci5vcmRlciA8IHJlcXVlc3Rpbmcub3JkZXI7XG4gIH0pO1xuXG4gIGlmICghaXNSZXF1aXJlZCkge1xuICAgIHZhciBfcmVxdWVzdGluZyA9ICdgJyArIHJlcXVlc3RpbmdOYW1lICsgJ2AnO1xuICAgIHZhciByZXF1ZXN0ZWQgPSAnYCcgKyByZXF1ZXN0ZWROYW1lICsgJ2AnO1xuICAgIGNvbnNvbGUud2FybihyZXF1ZXN0ZWQgKyAnIG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5ICcgKyBfcmVxdWVzdGluZyArICcgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSAnICsgX3JlcXVlc3RpbmcgKyAnIScpO1xuICB9XG4gIHJldHVybiBpc1JlcXVpcmVkO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gYXJyb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyRhcnJvdztcblxuICAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrXG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnYXJyb3cnLCAna2VlcFRvZ2V0aGVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBhcnJvd0VsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGEgc3RyaW5nLCBzdXBwb3NlIGl0J3MgYSBDU1Mgc2VsZWN0b3JcbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIG5vdCBmb3VuZCwgZG9uJ3QgcnVuIHRoZSBtb2RpZmllclxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlIGFycm93RWxlbWVudCBpc24ndCBhIHF1ZXJ5IHNlbGVjdG9yIHdlIG11c3QgY2hlY2sgdGhhdCB0aGVcbiAgICAvLyBwcm92aWRlZCBET00gbm9kZSBpcyBjaGlsZCBvZiBpdHMgcG9wcGVyIG5vZGVcbiAgICBpZiAoIWRhdGEuaW5zdGFuY2UucG9wcGVyLmNvbnRhaW5zKGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93LmVsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNWZXJ0aWNhbCA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIHZhciBzaWRlQ2FwaXRhbGl6ZWQgPSBpc1ZlcnRpY2FsID8gJ1RvcCcgOiAnTGVmdCc7XG4gIHZhciBzaWRlID0gc2lkZUNhcGl0YWxpemVkLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBhbHRTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgdmFyIGFycm93RWxlbWVudFNpemUgPSBnZXRPdXRlclNpemVzKGFycm93RWxlbWVudClbbGVuXTtcblxuICAvL1xuICAvLyBleHRlbmRzIGtlZXBUb2dldGhlciBiZWhhdmlvciBtYWtpbmcgc3VyZSB0aGUgcG9wcGVyIGFuZCBpdHNcbiAgLy8gcmVmZXJlbmNlIGhhdmUgZW5vdWdoIHBpeGVscyBpbiBjb25qdW5jdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0pO1xuICB2YXIgcG9wcGVyQm9yZGVyU2lkZSA9IHBhcnNlRmxvYXQoY3NzWydib3JkZXInICsgc2lkZUNhcGl0YWxpemVkICsgJ1dpZHRoJ10pO1xuICB2YXIgc2lkZVZhbHVlID0gY2VudGVyIC0gZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtIHBvcHBlck1hcmdpblNpZGUgLSBwb3BwZXJCb3JkZXJTaWRlO1xuXG4gIC8vIHByZXZlbnQgYXJyb3dFbGVtZW50IGZyb20gYmVpbmcgcGxhY2VkIG5vdCBjb250aWd1b3VzbHkgdG8gaXRzIHBvcHBlclxuICBzaWRlVmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihwb3BwZXJbbGVuXSAtIGFycm93RWxlbWVudFNpemUsIHNpZGVWYWx1ZSksIDApO1xuXG4gIGRhdGEuYXJyb3dFbGVtZW50ID0gYXJyb3dFbGVtZW50O1xuICBkYXRhLm9mZnNldHMuYXJyb3cgPSAoX2RhdGEkb2Zmc2V0cyRhcnJvdyA9IHt9LCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBzaWRlLCBNYXRoLnJvdW5kKHNpZGVWYWx1ZSkpLCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBhbHRTaWRlLCAnJyksIF9kYXRhJG9mZnNldHMkYXJyb3cpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IHZhcmlhdGlvbiBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IHZhcmlhdGlvblxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbikge1xuICBpZiAodmFyaWF0aW9uID09PSAnZW5kJykge1xuICAgIHJldHVybiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHZhcmlhdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgIHJldHVybiAnZW5kJztcbiAgfVxuICByZXR1cm4gdmFyaWF0aW9uO1xufVxuXG4vKipcbiAqIExpc3Qgb2YgYWNjZXB0ZWQgcGxhY2VtZW50cyB0byB1c2UgYXMgdmFsdWVzIG9mIHRoZSBgcGxhY2VtZW50YCBvcHRpb24uPGJyIC8+XG4gKiBWYWxpZCBwbGFjZW1lbnRzIGFyZTpcbiAqIC0gYGF1dG9gXG4gKiAtIGB0b3BgXG4gKiAtIGByaWdodGBcbiAqIC0gYGJvdHRvbWBcbiAqIC0gYGxlZnRgXG4gKlxuICogRWFjaCBwbGFjZW1lbnQgY2FuIGhhdmUgYSB2YXJpYXRpb24gZnJvbSB0aGlzIGxpc3Q6XG4gKiAtIGAtc3RhcnRgXG4gKiAtIGAtZW5kYFxuICpcbiAqIFZhcmlhdGlvbnMgYXJlIGludGVycHJldGVkIGVhc2lseSBpZiB5b3UgdGhpbmsgb2YgdGhlbSBhcyB0aGUgbGVmdCB0byByaWdodFxuICogd3JpdHRlbiBsYW5ndWFnZXMuIEhvcml6b250YWxseSAoYHRvcGAgYW5kIGBib3R0b21gKSwgYHN0YXJ0YCBpcyBsZWZ0IGFuZCBgZW5kYFxuICogaXMgcmlnaHQuPGJyIC8+XG4gKiBWZXJ0aWNhbGx5IChgbGVmdGAgYW5kIGByaWdodGApLCBgc3RhcnRgIGlzIHRvcCBhbmQgYGVuZGAgaXMgYm90dG9tLlxuICpcbiAqIFNvbWUgdmFsaWQgZXhhbXBsZXMgYXJlOlxuICogLSBgdG9wLWVuZGAgKG9uIHRvcCBvZiByZWZlcmVuY2UsIHJpZ2h0IGFsaWduZWQpXG4gKiAtIGByaWdodC1zdGFydGAgKG9uIHJpZ2h0IG9mIHJlZmVyZW5jZSwgdG9wIGFsaWduZWQpXG4gKiAtIGBib3R0b21gIChvbiBib3R0b20sIGNlbnRlcmVkKVxuICogLSBgYXV0by1lbmRgIChvbiB0aGUgc2lkZSB3aXRoIG1vcmUgc3BhY2UgYXZhaWxhYmxlLCBhbGlnbm1lbnQgZGVwZW5kcyBieSBwbGFjZW1lbnQpXG4gKlxuICogQHN0YXRpY1xuICogQHR5cGUge0FycmF5fVxuICogQGVudW0ge1N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1ldGhvZCBwbGFjZW1lbnRzXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBwbGFjZW1lbnRzID0gWydhdXRvLXN0YXJ0JywgJ2F1dG8nLCAnYXV0by1lbmQnLCAndG9wLXN0YXJ0JywgJ3RvcCcsICd0b3AtZW5kJywgJ3JpZ2h0LXN0YXJ0JywgJ3JpZ2h0JywgJ3JpZ2h0LWVuZCcsICdib3R0b20tZW5kJywgJ2JvdHRvbScsICdib3R0b20tc3RhcnQnLCAnbGVmdC1lbmQnLCAnbGVmdCcsICdsZWZ0LXN0YXJ0J107XG5cbi8vIEdldCByaWQgb2YgYGF1dG9gIGBhdXRvLXN0YXJ0YCBhbmQgYGF1dG8tZW5kYFxudmFyIHZhbGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuc2xpY2UoMyk7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5pdGlhbCBwbGFjZW1lbnQsIHJldHVybnMgYWxsIHRoZSBzdWJzZXF1ZW50IHBsYWNlbWVudHNcbiAqIGNsb2Nrd2lzZSAob3IgY291bnRlci1jbG9ja3dpc2UpLlxuICpcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgLSBBIHZhbGlkIHBsYWNlbWVudCAoaXQgYWNjZXB0cyB2YXJpYXRpb25zKVxuICogQGFyZ3VtZW50IHtCb29sZWFufSBjb3VudGVyIC0gU2V0IHRvIHRydWUgdG8gd2FsayB0aGUgcGxhY2VtZW50cyBjb3VudGVyY2xvY2t3aXNlXG4gKiBAcmV0dXJucyB7QXJyYXl9IHBsYWNlbWVudHMgaW5jbHVkaW5nIHRoZWlyIHZhcmlhdGlvbnNcbiAqL1xuZnVuY3Rpb24gY2xvY2t3aXNlKHBsYWNlbWVudCkge1xuICB2YXIgY291bnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGluZGV4ID0gdmFsaWRQbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KTtcbiAgdmFyIGFyciA9IHZhbGlkUGxhY2VtZW50cy5zbGljZShpbmRleCArIDEpLmNvbmNhdCh2YWxpZFBsYWNlbWVudHMuc2xpY2UoMCwgaW5kZXgpKTtcbiAgcmV0dXJuIGNvdW50ZXIgPyBhcnIucmV2ZXJzZSgpIDogYXJyO1xufVxuXG52YXIgQkVIQVZJT1JTID0ge1xuICBGTElQOiAnZmxpcCcsXG4gIENMT0NLV0lTRTogJ2Nsb2Nrd2lzZScsXG4gIENPVU5URVJDTE9DS1dJU0U6ICdjb3VudGVyY2xvY2t3aXNlJ1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZsaXAoZGF0YSwgb3B0aW9ucykge1xuICAvLyBpZiBgaW5uZXJgIG1vZGlmaWVyIGlzIGVuYWJsZWQsIHdlIGNhbid0IHVzZSB0aGUgYGZsaXBgIG1vZGlmaWVyXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2lubmVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQpIHtcbiAgICAvLyBzZWVtcyBsaWtlIGZsaXAgaXMgdHJ5aW5nIHRvIGxvb3AsIHByb2JhYmx5IHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvbiBhbnkgb2YgdGhlIGZsaXBwYWJsZSBzaWRlc1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVsxXSB8fCAnJztcblxuICB2YXIgZmxpcE9yZGVyID0gW107XG5cbiAgc3dpdGNoIChvcHRpb25zLmJlaGF2aW9yKSB7XG4gICAgY2FzZSBCRUhBVklPUlMuRkxJUDpcbiAgICAgIGZsaXBPcmRlciA9IFtwbGFjZW1lbnQsIHBsYWNlbWVudE9wcG9zaXRlXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBCRUhBVklPUlMuQ09VTlRFUkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQsIHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZsaXBPcmRlciA9IG9wdGlvbnMuYmVoYXZpb3I7XG4gIH1cblxuICBmbGlwT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCwgaW5kZXgpIHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICBwbGFjZW1lbnRPcHBvc2l0ZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG4gICAgdmFyIHJlZk9mZnNldHMgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuXG4gICAgLy8gdXNpbmcgZmxvb3IgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgbWF5IGNvbnRhaW4gZGVjaW1hbHMgd2UgYXJlIG5vdCBnb2luZyB0byBjb25zaWRlciBoZXJlXG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgICB2YXIgb3ZlcmxhcHNSZWYgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnJpZ2h0KSA+IGZsb29yKHJlZk9mZnNldHMubGVmdCkgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihyZWZPZmZzZXRzLnJpZ2h0KSB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIGZsb29yKHBvcHBlck9mZnNldHMuYm90dG9tKSA+IGZsb29yKHJlZk9mZnNldHMudG9wKSB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKHJlZk9mZnNldHMuYm90dG9tKTtcblxuICAgIHZhciBvdmVyZmxvd3NMZWZ0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5sZWZ0KSA8IGZsb29yKGJvdW5kYXJpZXMubGVmdCk7XG4gICAgdmFyIG92ZXJmbG93c1JpZ2h0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihib3VuZGFyaWVzLnJpZ2h0KTtcbiAgICB2YXIgb3ZlcmZsb3dzVG9wID0gZmxvb3IocG9wcGVyT2Zmc2V0cy50b3ApIDwgZmxvb3IoYm91bmRhcmllcy50b3ApO1xuICAgIHZhciBvdmVyZmxvd3NCb3R0b20gPSBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihib3VuZGFyaWVzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzQm91bmRhcmllcyA9IHBsYWNlbWVudCA9PT0gJ2xlZnQnICYmIG92ZXJmbG93c0xlZnQgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IHBsYWNlbWVudCA9PT0gJ3RvcCcgJiYgb3ZlcmZsb3dzVG9wIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgJiYgb3ZlcmZsb3dzQm90dG9tO1xuXG4gICAgLy8gZmxpcCB0aGUgdmFyaWF0aW9uIGlmIHJlcXVpcmVkXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeVJlZiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICAvLyBmbGlwcyB2YXJpYXRpb24gaWYgcG9wcGVyIGNvbnRlbnQgb3ZlcmZsb3dzIGJvdW5kYXJpZXNcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudCA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9uc0J5Q29udGVudCAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0xlZnQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0JvdHRvbSB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1RvcCk7XG5cbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9IGZsaXBwZWRWYXJpYXRpb25CeVJlZiB8fCBmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50O1xuXG4gICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMgfHwgZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgLy8gdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wXG4gICAgICBkYXRhLmZsaXBwZWQgPSB0cnVlO1xuXG4gICAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcykge1xuICAgICAgICBwbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgICAgdmFyaWF0aW9uID0gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wbGFjZW1lbnQgPSBwbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gJy0nICsgdmFyaWF0aW9uIDogJycpO1xuXG4gICAgICAvLyB0aGlzIG9iamVjdCBjb250YWlucyBgcG9zaXRpb25gLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0IGFsb25nIHdpdGhcbiAgICAgIC8vIGFueSBhZGRpdGlvbmFsIHByb3BlcnR5IHdlIG1heSBhZGQgaW4gdGhlIGZ1dHVyZVxuICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMucG9wcGVyLCBnZXRQb3BwZXJPZmZzZXRzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCkpO1xuXG4gICAgICBkYXRhID0gcnVuTW9kaWZpZXJzKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBkYXRhLCAnZmxpcCcpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24ga2VlcFRvZ2V0aGVyKGRhdGEpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdyaWdodCcgOiAnYm90dG9tJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICBpZiAocG9wcGVyW3NpZGVdIDwgZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pIC0gcG9wcGVyW21lYXN1cmVtZW50XTtcbiAgfVxuICBpZiAocG9wcGVyW29wU2lkZV0gPiBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW3NpZGVdKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWUgKyB1bml0IGludG8gYSBweCB2YWx1ZSBudW1iZXJcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzdHIgLSBWYWx1ZSArIHVuaXQgc3RyaW5nXG4gKiBAYXJndW1lbnQge1N0cmluZ30gbWVhc3VyZW1lbnQgLSBgaGVpZ2h0YCBvciBgd2lkdGhgXG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ8U3RyaW5nfVxuICogVmFsdWUgaW4gcGl4ZWxzLCBvciBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdmFsdWVzIHdlcmUgZXh0cmFjdGVkXG4gKi9cbmZ1bmN0aW9uIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cykge1xuICAvLyBzZXBhcmF0ZSB2YWx1ZSBmcm9tIHVuaXRcbiAgdmFyIHNwbGl0ID0gc3RyLm1hdGNoKC8oKD86XFwtfFxcKyk/XFxkKlxcLj9cXGQqKSguKikvKTtcbiAgdmFyIHZhbHVlID0gK3NwbGl0WzFdO1xuICB2YXIgdW5pdCA9IHNwbGl0WzJdO1xuXG4gIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyIGl0J3MgYW4gb3BlcmF0b3IsIEkgZ3Vlc3NcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBpZiAodW5pdC5pbmRleE9mKCclJykgPT09IDApIHtcbiAgICB2YXIgZWxlbWVudCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJyVwJzpcbiAgICAgICAgZWxlbWVudCA9IHBvcHBlck9mZnNldHM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJSc6XG4gICAgICBjYXNlICclcic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbGVtZW50ID0gcmVmZXJlbmNlT2Zmc2V0cztcbiAgICB9XG5cbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3QoZWxlbWVudCk7XG4gICAgcmV0dXJuIHJlY3RbbWVhc3VyZW1lbnRdIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3ZoJyB8fCB1bml0ID09PSAndncnKSB7XG4gICAgLy8gaWYgaXMgYSB2aCBvciB2dywgd2UgY2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHRoZSB2aWV3cG9ydFxuICAgIHZhciBzaXplID0gdm9pZCAwO1xuICAgIGlmICh1bml0ID09PSAndmgnKSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemUgLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBpcyBhbiBleHBsaWNpdCBwaXhlbCB1bml0LCB3ZSBnZXQgcmlkIG9mIHRoZSB1bml0IGFuZCBrZWVwIHRoZSB2YWx1ZVxuICAgIC8vIGlmIGlzIGFuIGltcGxpY2l0IHVuaXQsIGl0J3MgcHgsIGFuZCB3ZSByZXR1cm4ganVzdCB0aGUgdmFsdWVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBgb2Zmc2V0YCBzdHJpbmcgdG8gZXh0cmFwb2xhdGUgYHhgIGFuZCBgeWAgbnVtZXJpYyBvZmZzZXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IG9mZnNldFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gYmFzZVBsYWNlbWVudFxuICogQHJldHVybnMge0FycmF5fSBhIHR3byBjZWxscyBhcnJheSB3aXRoIHggYW5kIHkgb2Zmc2V0cyBpbiBudW1iZXJzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cywgYmFzZVBsYWNlbWVudCkge1xuICB2YXIgb2Zmc2V0cyA9IFswLCAwXTtcblxuICAvLyBVc2UgaGVpZ2h0IGlmIHBsYWNlbWVudCBpcyBsZWZ0IG9yIHJpZ2h0IGFuZCBpbmRleCBpcyAwIG90aGVyd2lzZSB1c2Ugd2lkdGhcbiAgLy8gaW4gdGhpcyB3YXkgdGhlIGZpcnN0IG9mZnNldCB3aWxsIHVzZSBhbiBheGlzIGFuZCB0aGUgc2Vjb25kIG9uZVxuICAvLyB3aWxsIHVzZSB0aGUgb3RoZXIgb25lXG4gIHZhciB1c2VIZWlnaHQgPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAvLyBTcGxpdCB0aGUgb2Zmc2V0IHN0cmluZyB0byBvYnRhaW4gYSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHNcbiAgLy8gVGhlIHJlZ2V4IGFkZHJlc3NlcyB2YWx1ZXMgd2l0aCB0aGUgcGx1cyBvciBtaW51cyBzaWduIGluIGZyb250ICgrMTAsIC0yMCwgZXRjKVxuICB2YXIgZnJhZ21lbnRzID0gb2Zmc2V0LnNwbGl0KC8oXFwrfFxcLSkvKS5tYXAoZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy50cmltKCk7XG4gIH0pO1xuXG4gIC8vIERldGVjdCBpZiB0aGUgb2Zmc2V0IHN0cmluZyBjb250YWlucyBhIHBhaXIgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIG9uZVxuICAvLyB0aGV5IGNvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYSBvciBzcGFjZVxuICB2YXIgZGl2aWRlciA9IGZyYWdtZW50cy5pbmRleE9mKGZpbmQoZnJhZ21lbnRzLCBmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnNlYXJjaCgvLHxcXHMvKSAhPT0gLTE7XG4gIH0pKTtcblxuICBpZiAoZnJhZ21lbnRzW2RpdmlkZXJdICYmIGZyYWdtZW50c1tkaXZpZGVyXS5pbmRleE9mKCcsJykgPT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdPZmZzZXRzIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZShzKSBhcmUgZGVwcmVjYXRlZCwgdXNlIGEgY29tbWEgKCwpIGluc3RlYWQuJyk7XG4gIH1cblxuICAvLyBJZiBkaXZpZGVyIGlzIGZvdW5kLCB3ZSBkaXZpZGUgdGhlIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kcyB0byBkaXZpZGVcbiAgLy8gdGhlbSBieSBvZnNldCBYIGFuZCBZLlxuICB2YXIgc3BsaXRSZWdleCA9IC9cXHMqLFxccyp8XFxzKy87XG4gIHZhciBvcHMgPSBkaXZpZGVyICE9PSAtMSA/IFtmcmFnbWVudHMuc2xpY2UoMCwgZGl2aWRlcikuY29uY2F0KFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMF1dKSwgW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVsxXV0uY29uY2F0KGZyYWdtZW50cy5zbGljZShkaXZpZGVyICsgMSkpXSA6IFtmcmFnbWVudHNdO1xuXG4gIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB3aXRoIHVuaXRzIHRvIGFic29sdXRlIHBpeGVscyB0byBhbGxvdyBvdXIgY29tcHV0YXRpb25zXG4gIG9wcyA9IG9wcy5tYXAoZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIC8vIE1vc3Qgb2YgdGhlIHVuaXRzIHJlbHkgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwb3BwZXJcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSAoaW5kZXggPT09IDEgPyAhdXNlSGVpZ2h0IDogdXNlSGVpZ2h0KSA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3BcbiAgICAvLyBUaGlzIGFnZ3JlZ2F0ZXMgYW55IGArYCBvciBgLWAgc2lnbiB0aGF0IGFyZW4ndCBjb25zaWRlcmVkIG9wZXJhdG9yc1xuICAgIC8vIGUuZy46IDEwICsgKzUgPT4gWzEwLCArLCArNV1cbiAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZiAoYVthLmxlbmd0aCAtIDFdID09PSAnJyAmJiBbJysnLCAnLSddLmluZGV4T2YoYikgIT09IC0xKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSA9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2UgaWYgKG1lcmdlV2l0aFByZXZpb3VzKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSArPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgICAvLyBIZXJlIHdlIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZXMgaW50byBudW1iZXIgdmFsdWVzIChpbiBweClcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMb29wIHRyb3VnaCB0aGUgb2Zmc2V0cyBhcnJheXMgYW5kIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnNcbiAgb3BzLmZvckVhY2goZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIG9wLmZvckVhY2goZnVuY3Rpb24gKGZyYWcsIGluZGV4Mikge1xuICAgICAgaWYgKGlzTnVtZXJpYyhmcmFnKSkge1xuICAgICAgICBvZmZzZXRzW2luZGV4XSArPSBmcmFnICogKG9wW2luZGV4MiAtIDFdID09PSAnLScgPyAtMSA6IDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQGFyZ3VtZW50IHtOdW1iZXJ8U3RyaW5nfSBvcHRpb25zLm9mZnNldD0wXG4gKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gb2Zmc2V0KGRhdGEsIF9yZWYpIHtcbiAgdmFyIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQsXG4gICAgICBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIHZhciBvZmZzZXRzID0gdm9pZCAwO1xuICBpZiAoaXNOdW1lcmljKCtvZmZzZXQpKSB7XG4gICAgb2Zmc2V0cyA9IFsrb2Zmc2V0LCAwXTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXRzID0gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYmFzZVBsYWNlbWVudCk7XG4gIH1cblxuICBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0IC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wIC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1sxXTtcbiAgfVxuXG4gIGRhdGEucG9wcGVyID0gcG9wcGVyO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCB8fCBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuXG4gIC8vIElmIG9mZnNldFBhcmVudCBpcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIHJlYWxseSB3YW50IHRvXG4gIC8vIGdvIG9uZSBzdGVwIHVwIGFuZCB1c2UgdGhlIG5leHQgb2Zmc2V0UGFyZW50IGFzIHJlZmVyZW5jZSB0b1xuICAvLyBhdm9pZCB0byBtYWtlIHRoaXMgbW9kaWZpZXIgY29tcGxldGVseSB1c2VsZXNzIGFuZCBsb29rIGxpa2UgYnJva2VuXG4gIGlmIChkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICBib3VuZGFyaWVzRWxlbWVudCA9IGdldE9mZnNldFBhcmVudChib3VuZGFyaWVzRWxlbWVudCk7XG4gIH1cblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzZXRzIHRoZSBwb3BwZXIncyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBkb2N1bWVudCBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGV4Y2x1ZGluZ1xuICAvLyB0aGUgc2l6ZSBvZiB0aGUgcG9wcGVyIGVsZW1lbnQgaXRzZWxmXG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKTtcbiAgdmFyIHBvcHBlclN0eWxlcyA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnN0eWxlOyAvLyBhc3NpZ25tZW50IHRvIGhlbHAgbWluaWZpY2F0aW9uXG4gIHZhciB0b3AgPSBwb3BwZXJTdHlsZXMudG9wLFxuICAgICAgbGVmdCA9IHBvcHBlclN0eWxlcy5sZWZ0LFxuICAgICAgdHJhbnNmb3JtID0gcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdO1xuXG4gIHBvcHBlclN0eWxlcy50b3AgPSAnJztcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSAnJztcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gJyc7XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0eWxlIHByb3BlcnRpZXMgYWZ0ZXIgdGhlIG9mZnNldHMgaGF2ZSBiZWVuIGNvbXB1dGVkXG4gIHBvcHBlclN0eWxlcy50b3AgPSB0b3A7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gbGVmdDtcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtO1xuXG4gIG9wdGlvbnMuYm91bmRhcmllcyA9IGJvdW5kYXJpZXM7XG5cbiAgdmFyIG9yZGVyID0gb3B0aW9ucy5wcmlvcml0eTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgdmFyIGNoZWNrID0ge1xuICAgIHByaW1hcnk6IGZ1bmN0aW9uIHByaW1hcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbcGxhY2VtZW50XTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA8IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5tYXgocG9wcGVyW3BsYWNlbWVudF0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIHBsYWNlbWVudCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2Vjb25kYXJ5OiBmdW5jdGlvbiBzZWNvbmRhcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgbWFpblNpZGUgPSBwbGFjZW1lbnQgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAndG9wJztcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlclttYWluU2lkZV07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPiBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWluKHBvcHBlclttYWluU2lkZV0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSAtIChwbGFjZW1lbnQgPT09ICdyaWdodCcgPyBwb3BwZXIud2lkdGggOiBwb3BwZXIuaGVpZ2h0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIG1haW5TaWRlLCB2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHZhciBzaWRlID0gWydsZWZ0JywgJ3RvcCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTEgPyAncHJpbWFyeScgOiAnc2Vjb25kYXJ5JztcbiAgICBwb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBjaGVja1tzaWRlXShwbGFjZW1lbnQpKTtcbiAgfSk7XG5cbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IHBvcHBlcjtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gc2hpZnQoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBzaGlmdHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIC8vIGlmIHNoaWZ0IHNoaWZ0dmFyaWF0aW9uIGlzIHNwZWNpZmllZCwgcnVuIHRoZSBtb2RpZmllclxuICBpZiAoc2hpZnR2YXJpYXRpb24pIHtcbiAgICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyO1xuXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ2JvdHRvbScsICd0b3AnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgdmFyIHNoaWZ0T2Zmc2V0cyA9IHtcbiAgICAgIHN0YXJ0OiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdKSxcbiAgICAgIGVuZDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVttZWFzdXJlbWVudF0gLSBwb3BwZXJbbWVhc3VyZW1lbnRdKVxuICAgIH07XG5cbiAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgc2hpZnRPZmZzZXRzW3NoaWZ0dmFyaWF0aW9uXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGhpZGUoZGF0YSkge1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2hpZGUnLCAncHJldmVudE92ZXJmbG93JykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciByZWZSZWN0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIGJvdW5kID0gZmluZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09ICdwcmV2ZW50T3ZlcmZsb3cnO1xuICB9KS5ib3VuZGFyaWVzO1xuXG4gIGlmIChyZWZSZWN0LmJvdHRvbSA8IGJvdW5kLnRvcCB8fCByZWZSZWN0LmxlZnQgPiBib3VuZC5yaWdodCB8fCByZWZSZWN0LnRvcCA+IGJvdW5kLmJvdHRvbSB8fCByZWZSZWN0LnJpZ2h0IDwgYm91bmQubGVmdCkge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IHRydWU7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gZmFsc2U7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBpbm5lcihkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBpc0hvcml6ID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIHN1YnRyYWN0TGVuZ3RoID0gWyd0b3AnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPT09IC0xO1xuXG4gIHBvcHBlcltpc0hvcml6ID8gJ2xlZnQnIDogJ3RvcCddID0gcmVmZXJlbmNlW2Jhc2VQbGFjZW1lbnRdIC0gKHN1YnRyYWN0TGVuZ3RoID8gcG9wcGVyW2lzSG9yaXogPyAnd2lkdGgnIDogJ2hlaWdodCddIDogMCk7XG5cbiAgZGF0YS5wbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChwb3BwZXIpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE1vZGlmaWVyIGZ1bmN0aW9uLCBlYWNoIG1vZGlmaWVyIGNhbiBoYXZlIGEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGFzc2lnbmVkXG4gKiB0byBpdHMgYGZuYCBwcm9wZXJ0eS48YnIgLz5cbiAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZSwgdGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0XG4gKiBtYWtlIHN1cmUgdGhleSBhcmUgcGVyZm9ybWFudCBlbm91Z2ggdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuXG4gKlxuICogQGZ1bmN0aW9uIE1vZGlmaWVyRm5cbiAqIEBhcmd1bWVudCB7ZGF0YU9iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5cbi8qKlxuICogTW9kaWZpZXJzIGFyZSBwbHVnaW5zIHVzZWQgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIgcG9wcGVycy48YnIgLz5cbiAqIFBvcHBlci5qcyB1c2VzIGEgc2V0IG9mIDkgbW9kaWZpZXJzIHRvIHByb3ZpZGUgYWxsIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXRpZXNcbiAqIG5lZWRlZCBieSB0aGUgbGlicmFyeS5cbiAqXG4gKiBVc3VhbGx5IHlvdSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgb3JkZXJgLCBgZm5gIGFuZCBgb25Mb2FkYCBwcm9wcy5cbiAqIEFsbCB0aGUgb3RoZXIgcHJvcGVydGllcyBhcmUgY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSB0d2Vha2VkLlxuICogQG5hbWVzcGFjZSBtb2RpZmllcnNcbiAqL1xudmFyIG1vZGlmaWVycyA9IHtcbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc3RhcnQgb3IgZW5kIG9mIGl0cyByZWZlcmVuY2VcbiAgICogZWxlbWVudC48YnIgLz5cbiAgICogSXQgd2lsbCByZWFkIHRoZSB2YXJpYXRpb24gb2YgdGhlIGBwbGFjZW1lbnRgIHByb3BlcnR5LjxiciAvPlxuICAgKiBJdCBjYW4gYmUgb25lIGVpdGhlciBgLWVuZGAgb3IgYC1zdGFydGAuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBzaGlmdDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0xMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDEwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHNoaWZ0XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgb2Zmc2V0YCBtb2RpZmllciBjYW4gc2hpZnQgeW91ciBwb3BwZXIgb24gYm90aCBpdHMgYXhpcy5cbiAgICpcbiAgICogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHVuaXRzOlxuICAgKiAtIGBweGAgb3IgdW5pdC1sZXNzLCBpbnRlcnByZXRlZCBhcyBwaXhlbHNcbiAgICogLSBgJWAgb3IgYCVyYCwgcGVyY2VudGFnZSByZWxhdGl2ZSB0byB0aGUgbGVuZ3RoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgKiAtIGAlcGAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcG9wcGVyIGVsZW1lbnRcbiAgICogLSBgdndgLCBDU1Mgdmlld3BvcnQgd2lkdGggdW5pdFxuICAgKiAtIGB2aGAsIENTUyB2aWV3cG9ydCBoZWlnaHQgdW5pdFxuICAgKlxuICAgKiBGb3IgbGVuZ3RoIGlzIGludGVuZGVkIHRoZSBtYWluIGF4aXMgcmVsYXRpdmUgdG8gdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyLjxiciAvPlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHBsYWNlbWVudCBpcyBgdG9wYCBvciBgYm90dG9tYCwgdGhlIGxlbmd0aCB3aWxsIGJlIHRoZVxuICAgKiBgd2lkdGhgLiBJbiBjYXNlIG9mIGBsZWZ0YCBvciBgcmlnaHRgLCBpdCB3aWxsIGJlIHRoZSBgaGVpZ2h0YC5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIGEgc2luZ2xlIHZhbHVlIChhcyBgTnVtYmVyYCBvciBgU3RyaW5nYCksIG9yIGEgcGFpciBvZiB2YWx1ZXNcbiAgICogYXMgYFN0cmluZ2AgZGl2aWRlZCBieSBhIGNvbW1hIG9yIG9uZSAob3IgbW9yZSkgd2hpdGUgc3BhY2VzLjxiciAvPlxuICAgKiBUaGUgbGF0dGVyIGlzIGEgZGVwcmVjYXRlZCBtZXRob2QgYmVjYXVzZSBpdCBsZWFkcyB0byBjb25mdXNpb24gYW5kIHdpbGwgYmVcbiAgICogcmVtb3ZlZCBpbiB2Mi48YnIgLz5cbiAgICogQWRkaXRpb25hbGx5LCBpdCBhY2NlcHRzIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IHVuaXRzLlxuICAgKiBOb3RlIHRoYXQgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMgYXJlbid0IHN1cHBvcnRlZC5cbiAgICpcbiAgICogVmFsaWQgZXhhbXBsZXMgYXJlOlxuICAgKiBgYGBcbiAgICogMTBcbiAgICogJzEwJSdcbiAgICogJzEwLCAxMCdcbiAgICogJzEwJSwgMTAnXG4gICAqICcxMCArIDEwJSdcbiAgICogJzEwIC0gNXZoICsgMyUnXG4gICAqICctMTBweCArIDV2aCwgNXB4IC0gNiUnXG4gICAqIGBgYFxuICAgKiA+ICoqTkIqKjogSWYgeW91IGRlc2lyZSB0byBhcHBseSBvZmZzZXRzIHRvIHlvdXIgcG9wcGVycyBpbiBhIHdheSB0aGF0IG1heSBtYWtlIHRoZW0gb3ZlcmxhcFxuICAgKiA+IHdpdGggdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnQsIHVuZm9ydHVuYXRlbHksIHlvdSB3aWxsIGhhdmUgdG8gZGlzYWJsZSB0aGUgYGZsaXBgIG1vZGlmaWVyLlxuICAgKiA+IFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgYXQgdGhpcyBbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgb2Zmc2V0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTIwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogb2Zmc2V0LFxuICAgIC8qKiBAcHJvcCB7TnVtYmVyfFN0cmluZ30gb2Zmc2V0PTBcbiAgICAgKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBvZmZzZXQ6IDBcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBwcmV2ZW50IHRoZSBwb3BwZXIgZnJvbSBiZWluZyBwb3NpdGlvbmVkIG91dHNpZGUgdGhlIGJvdW5kYXJ5LlxuICAgKlxuICAgKiBBIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIuIFRoaXMgbWFrZXMgc3VyZSB0aGUgcG9wcGVyIGFsd2F5cyBoYXMgYSBsaXR0bGUgcGFkZGluZ1xuICAgICAqIGJldHdlZW4gdGhlIGVkZ2VzIG9mIGl0cyBjb250YWluZXJcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSdzY3JvbGxQYXJlbnQnXG4gICAgICogQm91bmRhcmllcyB1c2VkIGJ5IHRoZSBtb2RpZmllci4gQ2FuIGJlIGBzY3JvbGxQYXJlbnRgLCBgd2luZG93YCxcbiAgICAgKiBgdmlld3BvcnRgIG9yIGFueSBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHJlZmVyZW5jZSBhbmQgaXRzIHBvcHBlciBzdGF5IG5lYXIgZWFjaCBvdGhlclxuICAgKiB3aXRob3V0IGxlYXZpbmcgYW55IGdhcCBiZXR3ZWVuIHRoZSB0d28uIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIGFycm93IGlzXG4gICAqIGVuYWJsZWQgYW5kIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGl0IHBvaW50cyB0byBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEl0IGNhcmVzIG9ubHkgYWJvdXQgdGhlIGZpcnN0IGF4aXMuIFlvdSBjYW4gc3RpbGwgaGF2ZSBwb3BwZXJzIHdpdGggbWFyZ2luXG4gICAqIGJldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAga2VlcFRvZ2V0aGVyOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTQwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNDAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjoga2VlcFRvZ2V0aGVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgbW9kaWZpZXIgaXMgdXNlZCB0byBtb3ZlIHRoZSBgYXJyb3dFbGVtZW50YCBvZiB0aGUgcG9wcGVyIHRvIG1ha2VcbiAgICogc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBlbGVtZW50IGFuZCBpdHMgcG9wcGVyIGVsZW1lbnQuXG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgb3V0ZXIgc2l6ZSBvZiB0aGUgYGFycm93RWxlbWVudGAgbm9kZSB0byBkZXRlY3QgaG93IG1hbnlcbiAgICogcGl4ZWxzIG9mIGNvbmp1bmN0aW9uIGFyZSBuZWVkZWQuXG4gICAqXG4gICAqIEl0IGhhcyBubyBlZmZlY3QgaWYgbm8gYGFycm93RWxlbWVudGAgaXMgcHJvdmlkZWQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcnJvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj01MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDUwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFycm93LFxuICAgIC8qKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbGVtZW50PSdbeC1hcnJvd10nIC0gU2VsZWN0b3Igb3Igbm9kZSB1c2VkIGFzIGFycm93ICovXG4gICAgZWxlbWVudDogJ1t4LWFycm93XSdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBmbGlwIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQgd2hlbiBpdCBzdGFydHMgdG8gb3ZlcmxhcCBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICpcbiAgICogKipOT1RFOioqIHRoaXMgbW9kaWZpZXIgd2lsbCBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlIGFuZCB3aWxsXG4gICAqIHJlc3RhcnQgaXQgaWYgaXQgZGV0ZWN0cyB0aGUgbmVlZCB0byBmbGlwIHRoZSBwbGFjZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBmbGlwOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTYwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogZmxpcCxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEFycmF5fSBiZWhhdmlvcj0nZmxpcCdcbiAgICAgKiBUaGUgYmVoYXZpb3IgdXNlZCB0byBjaGFuZ2UgdGhlIHBvcHBlcidzIHBsYWNlbWVudC4gSXQgY2FuIGJlIG9uZSBvZlxuICAgICAqIGBmbGlwYCwgYGNsb2Nrd2lzZWAsIGBjb3VudGVyY2xvY2t3aXNlYCBvciBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiB2YWxpZFxuICAgICAqIHBsYWNlbWVudHMgKHdpdGggb3B0aW9uYWwgdmFyaWF0aW9ucylcbiAgICAgKi9cbiAgICBiZWhhdmlvcjogJ2ZsaXAnLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBmbGlwIGlmIGl0IGhpdHMgdGhlIGVkZ2VzIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0ndmlld3BvcnQnXG4gICAgICogVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBkZWZpbmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBvcHBlciBwb3NpdGlvbi5cbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgbmV2ZXIgYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlIGRlZmluZWQgYm91bmRhcmllc1xuICAgICAqIChleGNlcHQgaWYgYGtlZXBUb2dldGhlcmAgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0JyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZmxpcFZhcmlhdGlvbnM9ZmFsc2VcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgc3dpdGNoIHBsYWNlbWVudCB2YXJpYXRpb24gYmV0d2VlbiBgLXN0YXJ0YCBhbmQgYC1lbmRgIHdoZW5cbiAgICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgb3ZlcmxhcHMgaXRzIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uczogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zQnlDb250ZW50PWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHBvcHBlciBlbGVtZW50IG92ZXJsYXBzIGl0cyByZWZlcmVuY2UgYm91bmRhcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYSBzZXQgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIGZsaXBWYXJpYXRpb25zQnlDb250ZW50OiBmYWxzZVxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM0QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogQHByb3Age3N0cmluZ30gW3g9J2JvdHRvbSddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBYIGF4aXMgKGBib3R0b21gIG9yIGB0b3BgKS4gQUtBIFggb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgYm90dG9tYFxuICAgICAqL1xuICAgIHg6ICdib3R0b20nLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdsZWZ0J11cbiAgICAgKiBXaGVyZSB0byBhbmNob3IgdGhlIFkgYXhpcyAoYGxlZnRgIG9yIGByaWdodGApLiBBS0EgWSBvZmZzZXQgb3JpZ2luLlxuICAgICAqIENoYW5nZSB0aGlzIGlmIHlvdXIgcG9wcGVyIHNob3VsZCBncm93IGluIGEgZGlyZWN0aW9uIGRpZmZlcmVudCBmcm9tIGByaWdodGBcbiAgICAgKi9cbiAgICB5OiAncmlnaHQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGNvbXB1dGVkIHN0eWxlcyB0byB0aGUgcG9wcGVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhpcyBtb2RpZmllci4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZVxuICAgKiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgUG9wcGVyLmpzIGluc2lkZSBhIGZyYW1ld29yayBvciB2aWV3IGxpYnJhcnkgYW5kIHlvdVxuICAgKiB3YW50IHRvIGRlbGVnYXRlIGFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgdG8gaXQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBpZiB5b3UgZGlzYWJsZSB0aGlzIG1vZGlmaWVyLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIGhhcyBpdHMgcG9zaXRpb24gc2V0IHRvIGBhYnNvbHV0ZWAgYmVmb3JlIFBvcHBlci5qcyBjYW4gZG8gaXRzIHdvcmshXG4gICAqXG4gICAqIEp1c3QgZGlzYWJsZSB0aGlzIG1vZGlmaWVyIGFuZCBkZWZpbmUgeW91ciBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB1bmRlZmluZWRcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYGRhdGFPYmplY3RgIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSBQb3BwZXIuanMuXG4gKiBUaGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gbW9kaWZpZXJzIGFuZCB0byB0aGUgYG9uQ3JlYXRlYCBhbmQgYG9uVXBkYXRlYCBjYWxsYmFja3MuXG4gKiBAbmFtZSBkYXRhT2JqZWN0XG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5pbnN0YW5jZSBUaGUgUG9wcGVyLmpzIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5wbGFjZW1lbnQgUGxhY2VtZW50IGFwcGxpZWQgdG8gcG9wcGVyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5vcmlnaW5hbFBsYWNlbWVudCBQbGFjZW1lbnQgb3JpZ2luYWxseSBkZWZpbmVkIG9uIGluaXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5mbGlwcGVkIFRydWUgaWYgcG9wcGVyIGhhcyBiZWVuIGZsaXBwZWQgYnkgZmxpcCBtb2RpZmllclxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmhpZGUgVHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kYXJpZXMsIHVzZWZ1bCB0byBrbm93IHdoZW4gdG8gaGlkZSB0aGUgcG9wcGVyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlci4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LiBJdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50c1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5wb3BwZXIgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSBgdG9wYCwgYGxlZnRgLCBgd2lkdGhgLCBgaGVpZ2h0YCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMuYXJyb3ddIGB0b3BgIGFuZCBgbGVmdGAgb2Zmc2V0cywgb25seSBvbmUgb2YgdGhlbSB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIDBcbiAqL1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBwcm92aWRlZCB0byBQb3BwZXIuanMgY29uc3RydWN0b3IuPGJyIC8+XG4gKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgYG9wdGlvbnNgIG9iamVjdCwgYXMgdGhlIDNyZCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50LlxuICAgKiBAcHJvcCB7UG9wcGVyLnBsYWNlbWVudHN9IHBsYWNlbWVudD0nYm90dG9tJ1xuICAgKi9cbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcblxuICAvKipcbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCBwb3BwZXIgdG8gcG9zaXRpb24gaXQgc2VsZiBpbiAnZml4ZWQnIG1vZGVcbiAgICogQHByb3Age0Jvb2xlYW59IHBvc2l0aW9uRml4ZWQ9ZmFsc2VcbiAgICovXG4gIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGV2ZW50cyAocmVzaXplLCBzY3JvbGwpIGFyZSBpbml0aWFsbHkgZW5hYmxlZC5cbiAgICogQHByb3Age0Jvb2xlYW59IGV2ZW50c0VuYWJsZWQ9dHJ1ZVxuICAgKi9cbiAgZXZlbnRzRW5hYmxlZDogdHJ1ZSxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBvcHBlciB3aGVuXG4gICAqIHlvdSBjYWxsIHRoZSBgZGVzdHJveWAgbWV0aG9kLlxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcmVtb3ZlT25EZXN0cm95PWZhbHNlXG4gICAqL1xuICByZW1vdmVPbkRlc3Ryb3k6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGNyZWF0ZWQuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uQ3JlYXRlfVxuICAgKi9cbiAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgdXBkYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkXG4gICAqIG9uIHRoZSBpbml0aWFsaXphdGlvbi9jcmVhdGlvbiBvZiB0aGUgcG9wcGVyLCBidXQgb25seSBvbiBzdWJzZXF1ZW50XG4gICAqIHVwZGF0ZXMuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uVXBkYXRlfVxuICAgKi9cbiAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgbW9kaWZpZXJzIHVzZWQgdG8gbW9kaWZ5IHRoZSBvZmZzZXRzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuXG4gICAqIFRoZXkgcHJvdmlkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgUG9wcGVyLmpzLlxuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvcHBlci5qcyBpbnN0YW5jZS5cbiAgICogQGNsYXNzIFBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR8cmVmZXJlbmNlT2JqZWN0fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgLyBYTUwgZWxlbWVudCB1c2VkIGFzIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiB1cGRhdGUuIEl0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IFVJIHVwZGF0ZSBhdmFpbGFibGUuXG4gICAgICogQG1ldGhvZCBzY2hlZHVsZVVwZGF0ZVxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgdXNlZnVsIHdoZW4gd3JpdGluZyBjdXN0b20gbW9kaWZpZXJzLlxuICAgICAqIFN0YXJ0aW5nIGZyb20gdmVyc2lvbiAxLjcsIHRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHlvdVxuICAgICAqIGluY2x1ZGUgYHBvcHBlci11dGlscy5qc2AgYmVmb3JlIGBwb3BwZXIuanNgLlxuICAgICAqXG4gICAgICogKipERVBSRUNBVElPTioqOiBUaGlzIHdheSB0byBhY2Nlc3MgUG9wcGVyVXRpbHMgaXMgZGVwcmVjYXRlZFxuICAgICAqIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjIhIFVzZSB0aGUgUG9wcGVyVXRpbHMgbW9kdWxlIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICogRHVlIHRvIHRoZSBoaWdoIGluc3RhYmlsaXR5IG9mIHRoZSBtZXRob2RzIGNvbnRhaW5lZCBpbiBVdGlscywgd2UgY2FuJ3RcbiAgICAgKiBndWFyYW50ZWUgdGhlbSB0byBmb2xsb3cgc2VtdmVyLiBVc2UgdGhlbSBhdCB5b3VyIG93biByaXNrIVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjhcbiAgICAgKiBAbWVtYmVyIFV0aWxzXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuXG4gIH1dKTtcbiAgcmV0dXJuIFBvcHBlcjtcbn0oKTtcblxuLyoqXG4gKiBUaGUgYHJlZmVyZW5jZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCBQb3BwZXIuanNcbiAqIGFuZCBsZXRzIHlvdSB1c2UgaXQgYXMgcmVwbGFjZW1lbnQgb2YgYSByZWFsIERPTSBub2RlLjxiciAvPlxuICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcG9zaXRpb24gYSBwb3BwZXIgcmVsYXRpdmVseSB0byBhIHNldCBvZiBjb29yZGluYXRlc1xuICogaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHRvIHVzZSBhcyByZWZlcmVuY2UuXG4gKlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZmVyZW5jZU9iamVjdCwgcG9wcGVyTm9kZSk7XG4gKiBgYGBcbiAqXG4gKiBOQjogVGhpcyBmZWF0dXJlIGlzbid0IHN1cHBvcnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nvar g;\n\n// This works in non-strict mode\ng = function () {\n\treturn this;\n}();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOlsiZyIsIkZ1bmN0aW9uIiwiZSIsIndpbmRvdyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFJQSxDQUFKOztBQUVBO0FBQ0FBLElBQUssWUFBVztBQUNmLFFBQU8sSUFBUDtBQUNBLENBRkcsRUFBSjs7QUFJQSxJQUFJO0FBQ0g7QUFDQUEsS0FBSUEsS0FBSyxJQUFJQyxRQUFKLENBQWEsYUFBYixHQUFUO0FBQ0EsQ0FIRCxDQUdFLE9BQU9DLENBQVAsRUFBVTtBQUNYO0FBQ0EsS0FBSSxRQUFPQyxNQUFQLHlDQUFPQSxNQUFQLE9BQWtCLFFBQXRCLEVBQWdDSCxJQUFJRyxNQUFKO0FBQ2hDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkwsQ0FBakIiLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWeightBasedShipping = __webpack_require__(12);\n\nvar _shiptimizeWeightBasedShipping2 = _interopRequireDefault(_shiptimizeWeightBasedShipping);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar WooShipitmizeAdmin = function () {\n    function WooShipitmizeAdmin() {\n        _classCallCheck(this, WooShipitmizeAdmin);\n\n        this.wbs = new _shiptimizeWeightBasedShipping2.default();\n    }\n\n    _createClass(WooShipitmizeAdmin, [{\n        key: 'bootstrap',\n        value: function bootstrap() {\n            this.urlParams();\n        }\n\n        /** \n         * If the export was successfull \n         * @param string appLink - the login url \n         */\n\n    }, {\n        key: 'exportSuccess',\n        value: function exportSuccess(appLink) {\n            if (appLink.trim().length == 0) {\n                return;\n            }\n\n            _shiptimizeUtils2.default.openNewWindow(appLink, '');\n        }\n\n        /** \n         * @param int id - the carrier id \n         */\n\n    }, {\n        key: 'getCarrier',\n        value: function getCarrier(id) {\n            for (var x = 0; x < shiptimize_carriers.length; ++x) {\n                if (shiptimize_carriers[x].Id == id) {\n                    return shiptimize_carriers[x];\n                }\n            }\n        }\n\n        /** \n         * Show aditional options for carrier \n         */\n\n    }, {\n        key: 'selectOptions',\n        value: function selectOptions(elem) {\n            this.selectServiceLevel(elem, jQuery('.shiptimize__service-level').val());\n            // hide the extra options for now \n            // this.selectExtraOptions(elem, jQuery('.shiptimize__extra-options').val());\n        }\n\n        /** \n         * @param DomElement  elem - the carrier select \n         */\n\n    }, {\n        key: 'selectServiceLevel',\n        value: function selectServiceLevel(elem, service_id) {\n            var carrier_id = elem.val();\n            var carrier = this.getCarrier(carrier_id);\n            var eServiceLevel = elem.siblings(\".shiptimize__service-level\");\n\n            var options_html = '';\n\n            if (_typeof(carrier.OptionList) != undefined) {\n                var options = carrier.OptionList;\n\n                for (var x = 0; x < options.length; ++x) {\n                    if (options[x].Type == 1 && typeof options[x].OptionValues != 'undefined') {\n                        var values = options[x].OptionValues;\n                        options_html += \"<option>-</option>\";\n                        for (var i = 0; i < values.length; ++i) {\n                            var selected = service_id == values[i].Id ? 'selected' : '';\n                            options_html += \"<option value='\" + values[i].Id + \"' \" + selected + \" >\" + values[i].Name + \"</option>\";\n                        }\n                    }\n                }\n            }\n\n            eServiceLevel.html(options_html);\n            if (options_html) {\n                eServiceLevel.addClass(\"active\");\n            } else {\n                eServiceLevel.removeClass(\"active\");\n            }\n        }\n    }, {\n        key: 'selectExtraOptions',\n        value: function selectExtraOptions(elem, selected_id) {\n            var carrier_id = elem.val();\n            var carrier = this.getCarrier(carrier_id);\n            var eExtraoptions = elem.siblings(\".shiptimize__extra-options\");\n\n            var options_html = '';\n            var option_values_html = [];\n\n            if (_typeof(carrier.OptionList) != undefined) {\n                var options = carrier.OptionList;\n                for (var x = 0; x < options.length; ++x) {\n                    if (options[x].Type == 0) {\n                        if (!options_html) {\n                            options_html += \"<option>-</option>\";\n                        }\n                        var selected = selected_id == options[x].Id ? 'selected' : '';\n                        options_html += \"<option value='\" + options[x].Id + \"' \" + selected + \" >\" + options[x].Name + \"</option>\";\n                    }\n\n                    if (options[x].OptionValues && options[x].OptionValues.length > 0) {\n                        var vhtml = '<select id=\"shiptimize-optionvalues' + options[x].Id + '\" class=\"shiptimize__optionvalues\">';\n                        for (var j = 0; j < options[x].OptionValues.length; ++j) {\n                            vhtml += '<option>' + options[x].OptionValues[j] + '</options>';\n                        }\n\n                        vhtml += '<select>';\n                    }\n                }\n            }\n\n            eExtraoptions.html(options_html);\n            if (options_html) {\n                eExtraoptions.addClass(\"active\");\n            } else {\n                eExtraoptions.removeClass(\"active\");\n            }\n        }\n    }, {\n        key: 'selectTab',\n        value: function selectTab(idx) {\n            jQuery(\".nav-tab\").removeClass('nav-tab-active');\n            jQuery(jQuery(\".nav-tab\").get(idx)).addClass('nav-tab-active');\n\n            jQuery(\".tab\").removeClass('active');\n            jQuery(jQuery(\".tab\").get(idx)).addClass('active');\n        }\n    }, {\n        key: 'accordion',\n        value: function accordion(elem) {\n            var $eparent = jQuery(elem).parent();\n            if ($eparent.hasClass('open')) {\n                $eparent.removeClass('open');\n            } else {\n                $eparent.addClass('open');\n            }\n        }\n\n        /** \n        * Is there stuff in the url params we care about? \n        **/\n\n    }, {\n        key: 'urlParams',\n        value: function urlParams() {\n            var parts = document.location.search.split('&');\n            for (var x = 0; x < parts.length; ++x) {\n                var keyval = parts[x].split('=');\n                var key = keyval[0];\n                var value = decodeURIComponent(keyval[1]);\n\n                if (key == 'CallbackURL') {\n                    console.log(\"We are creating a label\");\n                    shiptimize.openLoader(shiptimize_label_request);\n                    shiptimize.monitorLabelStatus(value);\n                }\n            }\n        }\n    }]);\n\n    return WooShipitmizeAdmin;\n}();\n\nexports.default = WooShipitmizeAdmin;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcz80MDA5Il0sIm5hbWVzIjpbIldvb1NoaXBpdG1pemVBZG1pbiIsIndicyIsIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwidXJsUGFyYW1zIiwiYXBwTGluayIsInRyaW0iLCJsZW5ndGgiLCJVdGlscyIsIm9wZW5OZXdXaW5kb3ciLCJpZCIsIngiLCJzaGlwdGltaXplX2NhcnJpZXJzIiwiSWQiLCJlbGVtIiwic2VsZWN0U2VydmljZUxldmVsIiwialF1ZXJ5IiwidmFsIiwic2VydmljZV9pZCIsImNhcnJpZXJfaWQiLCJjYXJyaWVyIiwiZ2V0Q2FycmllciIsImVTZXJ2aWNlTGV2ZWwiLCJzaWJsaW5ncyIsIm9wdGlvbnNfaHRtbCIsIk9wdGlvbkxpc3QiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwiVHlwZSIsIk9wdGlvblZhbHVlcyIsInZhbHVlcyIsImkiLCJzZWxlY3RlZCIsIk5hbWUiLCJodG1sIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNlbGVjdGVkX2lkIiwiZUV4dHJhb3B0aW9ucyIsIm9wdGlvbl92YWx1ZXNfaHRtbCIsInZodG1sIiwiaiIsImlkeCIsImdldCIsIiRlcGFyZW50IiwicGFyZW50IiwiaGFzQ2xhc3MiLCJwYXJ0cyIsImRvY3VtZW50IiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGxpdCIsImtleXZhbCIsImtleSIsInZhbHVlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiY29uc29sZSIsImxvZyIsInNoaXB0aW1pemUiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwibW9uaXRvckxhYmVsU3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLGtCO0FBRWpCLGtDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsR0FBTCxHQUFXLElBQUlDLHVDQUFKLEVBQVg7QUFD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IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcbmltcG9ydCBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZyBmcm9tICcuL3NoaXB0aW1pemUtd2VpZ2h0LWJhc2VkLXNoaXBwaW5nLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vU2hpcGl0bWl6ZUFkbWluIHsgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy53YnMgPSBuZXcgU2hpcHRpbWl6ZVdlaWdodEJhc2VkU2hpcHBpbmcoKTtcbiAgICB9XG5cbiAgICBib290c3RyYXAoKSB7IFxuICAgICAgICB0aGlzLnVybFBhcmFtcygpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBJZiB0aGUgZXhwb3J0IHdhcyBzdWNjZXNzZnVsbCBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIGFwcExpbmsgLSB0aGUgbG9naW4gdXJsIFxuICAgICAqL1xuICAgIGV4cG9ydFN1Y2Nlc3MoYXBwTGluaykge1xuICAgICAgICBpZihhcHBMaW5rLnRyaW0oKS5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm47IFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBVdGlscy5vcGVuTmV3V2luZG93KGFwcExpbmssICcnKTsgXG4gICAgfSBcblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0gaW50IGlkIC0gdGhlIGNhcnJpZXIgaWQgXG4gICAgICovIFxuICAgIGdldENhcnJpZXIoaWQpe1xuICAgICAgICBmb3IoIGxldCB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3ggKXtcbiAgICAgICAgICAgIGlmKHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgPT0gaWQpe1xuICAgICAgICAgICAgICAgIHJldHVybiBzaGlwdGltaXplX2NhcnJpZXJzW3hdOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBTaG93IGFkaXRpb25hbCBvcHRpb25zIGZvciBjYXJyaWVyIFxuICAgICAqLyBcbiAgICBzZWxlY3RPcHRpb25zKGVsZW0pe1xuICAgICAgICB0aGlzLnNlbGVjdFNlcnZpY2VMZXZlbChlbGVtLCBqUXVlcnkoJy5zaGlwdGltaXplX19zZXJ2aWNlLWxldmVsJykudmFsKCkpOyBcbiAgICAgICAgLy8gaGlkZSB0aGUgZXh0cmEgb3B0aW9ucyBmb3Igbm93IFxuICAgICAgICAvLyB0aGlzLnNlbGVjdEV4dHJhT3B0aW9ucyhlbGVtLCBqUXVlcnkoJy5zaGlwdGltaXplX19leHRyYS1vcHRpb25zJykudmFsKCkpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0gRG9tRWxlbWVudCAgZWxlbSAtIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICAgKi8gXG4gICAgc2VsZWN0U2VydmljZUxldmVsKCBlbGVtICwgc2VydmljZV9pZCApIHtcbiAgICAgICAgbGV0IGNhcnJpZXJfaWQgPSBlbGVtLnZhbCgpOyBcbiAgICAgICAgbGV0IGNhcnJpZXIgPSB0aGlzLmdldENhcnJpZXIoY2Fycmllcl9pZCk7IFxuICAgICAgICBsZXQgZVNlcnZpY2VMZXZlbCA9IGVsZW0uc2libGluZ3MoXCIuc2hpcHRpbWl6ZV9fc2VydmljZS1sZXZlbFwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc19odG1sID0gJyc7XG5cbiAgICAgICAgaWYoIHR5cGVvZihjYXJyaWVyLk9wdGlvbkxpc3QpICE9IHVuZGVmaW5lZCApe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBjYXJyaWVyLk9wdGlvbkxpc3Q7IFxuXG4gICAgICAgICAgICBmb3IoIGxldCB4ID0gMDsgeCA8IG9wdGlvbnMubGVuZ3RoOyArK3gpe1xuICAgICAgICAgICAgICAgIGlmKCBvcHRpb25zW3hdLlR5cGUgPT0gMSAmJiB0eXBlb2Yob3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMpICE9ICd1bmRlZmluZWQnICl7ICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG9wdGlvbnNbeF0uT3B0aW9uVmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uPi08L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNlcnZpY2VfaWQgPT0gdmFsdWVzW2ldLklkID8gJ3NlbGVjdGVkJyA6Jyc7IFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc19odG1sICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyB2YWx1ZXNbaV0uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiID5cIiArIHZhbHVlc1tpXS5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVTZXJ2aWNlTGV2ZWwuaHRtbChvcHRpb25zX2h0bWwpO1xuICAgICAgICBpZihvcHRpb25zX2h0bWwpe1xuICAgICAgICAgICAgZVNlcnZpY2VMZXZlbC5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlU2VydmljZUxldmVsLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBzZWxlY3RFeHRyYU9wdGlvbnMoIGVsZW0sIHNlbGVjdGVkX2lkICl7IGxldCBjYXJyaWVyX2lkID0gZWxlbS52YWwoKTsgXG4gICAgICAgIGxldCBjYXJyaWVyID0gdGhpcy5nZXRDYXJyaWVyKGNhcnJpZXJfaWQpOyBcbiAgICAgICAgbGV0IGVFeHRyYW9wdGlvbnMgPSBlbGVtLnNpYmxpbmdzKFwiLnNoaXB0aW1pemVfX2V4dHJhLW9wdGlvbnNcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfaHRtbCA9ICcnO1xuICAgICAgICBsZXQgb3B0aW9uX3ZhbHVlc19odG1sID0gW107IFxuXG4gICAgICAgIGlmKCB0eXBlb2YoY2Fycmllci5PcHRpb25MaXN0KSAhPSB1bmRlZmluZWQgKXtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gY2Fycmllci5PcHRpb25MaXN0OyBcbiAgICAgICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgb3B0aW9ucy5sZW5ndGg7ICsreCl7XG4gICAgICAgICAgICAgICAgaWYoIG9wdGlvbnNbeF0uVHlwZSA9PSAwICl7ICBcbiAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uPi08L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2VsZWN0ZWRfaWQgPT0gb3B0aW9uc1t4XS5JZCA/ICdzZWxlY3RlZCcgOicnOyBcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc19odG1sICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25zW3hdLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIiA+XCIgKyBvcHRpb25zW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMgJiYgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmh0bWwgPSAnPHNlbGVjdCBpZD1cInNoaXB0aW1pemUtb3B0aW9udmFsdWVzJyArIG9wdGlvbnNbeF0uSWQgKydcIiBjbGFzcz1cInNoaXB0aW1pemVfX29wdGlvbnZhbHVlc1wiPic7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IG9wdGlvbnNbeF0uT3B0aW9uVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aHRtbCArPSAnPG9wdGlvbj4nICsgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXNbal0gKyAnPC9vcHRpb25zPic7XG4gICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgdmh0bWwgKz0gJzxzZWxlY3Q+JzsgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVFeHRyYW9wdGlvbnMuaHRtbChvcHRpb25zX2h0bWwpO1xuICAgICAgICBpZihvcHRpb25zX2h0bWwpe1xuICAgICAgICAgICAgZUV4dHJhb3B0aW9ucy5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlRXh0cmFvcHRpb25zLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICB9IFxuICAgIH0gXG4gXG4gICAgc2VsZWN0VGFiKGlkeCl7XG4gICAgICAgIGpRdWVyeShcIi5uYXYtdGFiXCIpLnJlbW92ZUNsYXNzKCduYXYtdGFiLWFjdGl2ZScpO1xuICAgICAgICBqUXVlcnkoalF1ZXJ5KFwiLm5hdi10YWJcIikuZ2V0KGlkeCkpLmFkZENsYXNzKCduYXYtdGFiLWFjdGl2ZScpOyBcblxuICAgICAgICBqUXVlcnkoXCIudGFiXCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsgXG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCIudGFiXCIpLmdldChpZHgpKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgYWNjb3JkaW9uKGVsZW0pe1xuICAgICAgICBsZXQgJGVwYXJlbnQgPSBqUXVlcnkoZWxlbSkucGFyZW50KCk7IFxuICAgICAgICBpZiAoJGVwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKSkge1xuICAgICAgICAgICAgJGVwYXJlbnQucmVtb3ZlQ2xhc3MoJ29wZW4nKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAkZXBhcmVudC5hZGRDbGFzcygnb3BlbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICogSXMgdGhlcmUgc3R1ZmYgaW4gdGhlIHVybCBwYXJhbXMgd2UgY2FyZSBhYm91dD8gXG4gICAgKiovXG4gICAgdXJsUGFyYW1zKCkge1xuICAgICAgICBsZXQgcGFydHMgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2guc3BsaXQoJyYnKTsgXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGFydHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICBsZXQga2V5dmFsID0gcGFydHNbeF0uc3BsaXQoJz0nKTsgXG4gICAgICAgICAgbGV0IGtleSA9IGtleXZhbFswXTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5dmFsWzFdKTsgXG5cbiAgICAgICAgICBpZihrZXkgPT0gJ0NhbGxiYWNrVVJMJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXZSBhcmUgY3JlYXRpbmcgYSBsYWJlbFwiKTtcbiAgICAgICAgICAgIHNoaXB0aW1pemUub3BlbkxvYWRlcihzaGlwdGltaXplX2xhYmVsX3JlcXVlc3QpOyBcbiAgICAgICAgICAgIHNoaXB0aW1pemUubW9uaXRvckxhYmVsU3RhdHVzKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * plug into the  dom and  append shiptimize settings\n * Save on change via ajax \n * We can\'t save rule by rule withough pluggin into the checkout \n * Currently only the instance id is saved \n */\nvar ShiptimizeWeightBasedShipping = function () {\n  function ShiptimizeWeightBasedShipping() {\n    _classCallCheck(this, ShiptimizeWeightBasedShipping);\n\n    console.log("Shiptimize options for WeightBasedShipping");\n    this.init();\n  }\n\n  _createClass(ShiptimizeWeightBasedShipping, [{\n    key: "init",\n    value: function init() {\n      //not a shipping method page \n      if (typeof shiptimize_carrier == \'undefined\') {\n        return;\n      }\n\n      var regexInstance = /instance_id=([0-9]*)/.exec(window.location.search);\n\n      if (!regexInstance) {\n        console.log("invalid url params cannot find instance_id " + window.location.search);\n        return;\n      }\n\n      this.instance_id = regexInstance[1];\n      this.attachShiptimizeOptions();\n    }\n\n    /** \n     * Save our options for this instance \n     */\n\n  }, {\n    key: "saveOptions",\n    value: function saveOptions(elem) {\n      var data = {\n        \'data\': this.eForm.serializeArray(),\n        \'instance_id\': this.instance_id,\n        \'action\': \'shiptimize_wbs_settings\'\n      };\n\n      jQuery.post(ajaxurl, data, function (resp) {\n        console.log("response ", resp);\n      });\n\n      console.log(this.eForm, "Saveoptions ", data);\n\n      jQuery(".shiptimize-optionvalues").hide();\n      var extraOption = jQuery(".shiptimize-extraoptions").val();\n      jQuery("#shiptimize-extraoptions" + extraOption).show();\n    }\n\n    /** \n     * Attach the shiptimize options under the title   \n     */\n\n  }, {\n    key: "attachShiptimizeOptions",\n    value: function attachShiptimizeOptions() {\n\n      var eShiptimizeOptions = jQuery("<form id=\'shiptimizeoptions\' class=\\"wbs-shiptimizeoptions\\"></form>");\n      var oHtml = \'\';\n\n      //no options , nothing to do \n      if (typeof shiptimize_carrier.OptionList == \'undefined\') {\n        return;\n      }\n\n      //shiptimize_extraoptions\n      //shiptimize_checkboxes\n      //Add a Save button \n      var htmlServiceLevels = \'\';\n      var htmlExtraOptions = \'\';\n      var htmlCheckboxes = \'\';\n      var htmlExtravalues = \'\';\n      for (var x = 0; x < shiptimize_carrier.OptionList.length; ++x) {\n        var option = shiptimize_carrier.OptionList[x];\n\n        if (option.Type == 1) {\n          if (typeof option.OptionValues != \'undefined\') {\n            for (var i = 0; i < option.OptionValues.length; ++i) {\n              var optionChild = option.OptionValues[i];\n              var selected = shiptimize_options[\'service_level\'] == optionChild.Id ? \'selected\' : \'\';\n              htmlServiceLevels += "<option value=\'" + optionChild.Id + "\' " + selected + ">" + optionChild.Name + "</option>";\n            }\n          }\n        } else if (shiptimize_extraoptions.includes(option.Id + "")) {\n          var _selected = shiptimize_options[\'extraoptions\'] == option.Id ? \'selected\' : \'\';\n          htmlExtraOptions += "<option value=\'" + option.Id + "\' " + _selected + ">" + option.Name + "</option>";\n          if (option.OptionFields && option.OptionFields.length > 0) {\n            for (var j = 0; j < option.OptionFields.length; ++j) {\n              if (option.OptionFields[j].OptionValues) {\n                var optionField = option.OptionFields[j];\n                htmlExtravalues += \'<select class="shiptimize-optionvalues" id="shiptimize-extraoptions\' + option.Id + \'" name="extraoptions\' + option.Id + \'" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\">\';\n                for (var i = 0; i < optionField.OptionValues.length; ++i) {\n                  var _optionChild = optionField.OptionValues[i];\n                  var _selected2 = shiptimize_options[\'extraoptionvalue\' + option.Id] == _optionChild.Id ? \'selected\' : \'\';\n                  htmlExtravalues += "<option value=\'" + _optionChild.Id + "\' " + _selected2 + ">" + _optionChild.Name + "</option>";\n                }\n                htmlExtravalues += \'</select>\';\n              }\n            }\n          }\n        } else {\n          var keys = Object.keys(shiptimize_checkboxes);\n          for (var i = 0; i < keys.length; ++i) {\n            if (option.Id == keys[i]) {\n              var optionName = shiptimize_checkboxes[option.Id];\n              var checked = shiptimize_options[optionName] == option.Id ? \'checked\' : \'\';\n              htmlCheckboxes += \'<span class="wbs-shiptimize-option"><input \' + checked + \' class="wbs-rse-checkbox"  onchange="shiptimize.platform.wbs.saveOptions(jQuery(this))" type="checkbox" name="\' + optionName + \'" value="\' + option.Id + \'"/>\' + shiptimize_checkboxes[option.Id] + "</span>";\n            }\n          }\n        }\n      }\n\n      if (htmlServiceLevels.length > 0) {\n        oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.service_level + "</label> <select name=\\"service_level\\"  onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\"><option>-</option>" + htmlServiceLevels + "</select></span>";\n      }\n\n      if (htmlExtraOptions.length > 0) {\n        oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.extraoptions + "</label> <select class=\'shiptimize-extraoptions\' name=\\"extraoptions\\"  onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\"><option>-</option>" + htmlExtraOptions + "</select> " + htmlExtravalues + " </span>";\n      }\n\n      oHtml += htmlCheckboxes;\n\n      //Pickup Behaviour?\n      if (shiptimize_carrier.HasPickup) {\n        var selecthtml = \'<select class="shiptimize-extraoptions" name="pickupbehaviour" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\">\';\n        for (var x = 0; x < 3; ++x) {\n          var _selected3 = shiptimize_options[\'pickupbehaviour\'] == x ? \'selected\' : \'\';\n          selecthtml += "<option value=\\"" + x + "\\" " + _selected3 + ">" + shiptimize_labels[\'pickup\' + x] + "</option>";\n        }\n        selecthtml += \'</select>\';\n\n        oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.pickupbehaviour + "</label> " + selecthtml + "</span>";\n      }\n\n      if (oHtml.length > 0) {\n        eShiptimizeOptions.html("<h3>Shiptimize Settings</h3>" + oHtml);\n        eShiptimizeOptions.insertAfter(jQuery("#mainform"));\n        this.eForm = jQuery("#shiptimizeoptions");\n        this.saveOptions(jQuery(".shiptimize-extraoptions"));\n      }\n    }\n  }]);\n\n  return ShiptimizeWeightBasedShipping;\n}();\n\nexports.default = ShiptimizeWeightBasedShipping;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlX2xldmVsIiwiZXh0cmFvcHRpb25zIiwiSGFzUGlja3VwIiwic2VsZWN0aHRtbCIsInBpY2t1cGJlaGF2aW91ciIsImh0bWwiLCJpbnNlcnRBZnRlciIsInNhdmVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7OztJQU1xQkEsNkI7QUFFbkIs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QUFkOztBQUVBL0IsbUVBQXlEMkIsa0JBQWtCSyxlQUEzRSxpQkFBc0dELFVBQXRHO0FBQ0Q7O0FBR0QsVUFBSS9CLE1BQU1PLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNwQlIsMkJBQW1Ca0MsSUFBbkIsQ0FBd0IsaUNBQWlDakMsS0FBekQ7QUFDQUQsMkJBQW1CbUMsV0FBbkIsQ0FBK0IzQyxPQUFPLFdBQVAsQ0FBL0I7QUFDQSxhQUFLRixLQUFMLEdBQWFFLE9BQU8sb0JBQVAsQ0FBYjtBQUNBLGFBQUs0QyxXQUFMLENBQWlCNUMsT0FBTywwQkFBUCxDQUFqQjtBQUNEO0FBRUY7Ozs7OztrQkF6SWtCaEIsNkIiLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBwbHVnIGludG8gdGhlICBkb20gYW5kICBhcHBlbmQgc2hpcHRpbWl6ZSBzZXR0aW5nc1xuICogU2F2ZSBvbiBjaGFuZ2UgdmlhIGFqYXggXG4gKiBXZSBjYW4ndCBzYXZlIHJ1bGUgYnkgcnVsZSB3aXRob3VnaCBwbHVnZ2luIGludG8gdGhlIGNoZWNrb3V0IFxuICogQ3VycmVudGx5IG9ubHkgdGhlIGluc3RhbmNlIGlkIGlzIHNhdmVkIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZyB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc29sZS5sb2coXCJTaGlwdGltaXplIG9wdGlvbnMgZm9yIFdlaWdodEJhc2VkU2hpcHBpbmdcIik7XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgLy9ub3QgYSBzaGlwcGluZyBtZXRob2QgcGFnZSBcbiAgICBpZiAodHlwZW9mIChzaGlwdGltaXplX2NhcnJpZXIpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVnZXhJbnN0YW5jZSA9IC9pbnN0YW5jZV9pZD0oWzAtOV0qKS8uZXhlYyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIGlmICghcmVnZXhJbnN0YW5jZSkge1xuICAgICAgY29uc29sZS5sb2coXCJpbnZhbGlkIHVybCBwYXJhbXMgY2Fubm90IGZpbmQgaW5zdGFuY2VfaWQgXCIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlX2lkID0gcmVnZXhJbnN0YW5jZVsxXTtcbiAgICB0aGlzLmF0dGFjaFNoaXB0aW1pemVPcHRpb25zKCk7XG4gIH1cblxuICAvKiogXG4gICAqIFNhdmUgb3VyIG9wdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2UgXG4gICAqL1xuICBzYXZlT3B0aW9ucyhlbGVtKSB7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAnZGF0YSc6IHRoaXMuZUZvcm0uc2VyaWFsaXplQXJyYXkoKSxcbiAgICAgICdpbnN0YW5jZV9pZCc6IHRoaXMuaW5zdGFuY2VfaWQsXG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2JzX3NldHRpbmdzJ1xuICAgIH07XG5cbiAgICBqUXVlcnkucG9zdChhamF4dXJsLCBkYXRhLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY29uc29sZS5sb2coXCJyZXNwb25zZSBcIiwgcmVzcCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLmVGb3JtLCBcIlNhdmVvcHRpb25zIFwiLCBkYXRhKTtcbiAgICBcbiAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1vcHRpb252YWx1ZXNcIikuaGlkZSgpO1xuICAgIHZhciBleHRyYU9wdGlvbiA9IGpRdWVyeShcIi5zaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiKS52YWwoKTsgXG4gICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIrZXh0cmFPcHRpb24pLnNob3coKTtcbiAgICAgXG4gIH1cblxuICAvKiogXG4gICAqIEF0dGFjaCB0aGUgc2hpcHRpbWl6ZSBvcHRpb25zIHVuZGVyIHRoZSB0aXRsZSAgIFxuICAgKi9cbiAgYXR0YWNoU2hpcHRpbWl6ZU9wdGlvbnMoKSB7XG5cbiAgICB2YXIgZVNoaXB0aW1pemVPcHRpb25zID0galF1ZXJ5KFwiPGZvcm0gaWQ9J3NoaXB0aW1pemVvcHRpb25zJyBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemVvcHRpb25zXFxcIj48L2Zvcm0+XCIpO1xuICAgIHZhciBvSHRtbCA9ICcnO1xuXG4gICAgLy9ubyBvcHRpb25zICwgbm90aGluZyB0byBkbyBcbiAgICBpZiAodHlwZW9mIChzaGlwdGltaXplX2NhcnJpZXIuT3B0aW9uTGlzdCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL3NoaXB0aW1pemVfZXh0cmFvcHRpb25zXG4gICAgLy9zaGlwdGltaXplX2NoZWNrYm94ZXNcbiAgICAvL0FkZCBhIFNhdmUgYnV0dG9uIFxuICAgIGxldCBodG1sU2VydmljZUxldmVscyA9ICcnO1xuICAgIGxldCBodG1sRXh0cmFPcHRpb25zID0gJyc7XG4gICAgbGV0IGh0bWxDaGVja2JveGVzID0gJyc7XG4gICAgbGV0IGh0bWxFeHRyYXZhbHVlcyA9ICcnOyBcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0Lmxlbmd0aDsgKyt4KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBzaGlwdGltaXplX2NhcnJpZXIuT3B0aW9uTGlzdFt4XTtcblxuICAgICAgaWYgKG9wdGlvbi5UeXBlID09IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAob3B0aW9uLk9wdGlvblZhbHVlcykgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbi5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25DaGlsZCA9IG9wdGlvbi5PcHRpb25WYWx1ZXNbaV07XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ3NlcnZpY2VfbGV2ZWwnXSA9PSBvcHRpb25DaGlsZC5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgICAgIGh0bWxTZXJ2aWNlTGV2ZWxzICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25DaGlsZC5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb25DaGlsZC5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2hpcHRpbWl6ZV9leHRyYW9wdGlvbnMuaW5jbHVkZXMob3B0aW9uLklkK1wiXCIpKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snZXh0cmFvcHRpb25zJ10gPT0gb3B0aW9uLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICBodG1sRXh0cmFPcHRpb25zICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb24uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiPlwiICsgb3B0aW9uLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICBpZiAob3B0aW9uLk9wdGlvbkZpZWxkcyAmJiBvcHRpb24uT3B0aW9uRmllbGRzLmxlbmd0aD4wKSB7XG4gICAgICAgICAgZm9yICggdmFyIGo9MDsgajxvcHRpb24uT3B0aW9uRmllbGRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLk9wdGlvbkZpZWxkc1tqXS5PcHRpb25WYWx1ZXMpIHsgXG4gICAgICAgICAgICAgIHZhciBvcHRpb25GaWVsZCA9IG9wdGlvbi5PcHRpb25GaWVsZHNbal07IFxuICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gJzxzZWxlY3QgY2xhc3M9XCJzaGlwdGltaXplLW9wdGlvbnZhbHVlc1wiIGlkPVwic2hpcHRpbWl6ZS1leHRyYW9wdGlvbnMnICsgb3B0aW9uLklkICsgJ1wiIG5hbWU9XCJleHRyYW9wdGlvbnMnICsgb3B0aW9uLklkICsgJ1wiIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj4nOyBcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25GaWVsZC5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uQ2hpbGQgPSBvcHRpb25GaWVsZC5PcHRpb25WYWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydleHRyYW9wdGlvbnZhbHVlJyArIG9wdGlvbi5JZF0gPT0gb3B0aW9uQ2hpbGQuSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgICAgICAgICAgaHRtbEV4dHJhdmFsdWVzICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25DaGlsZC5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb25DaGlsZC5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gJzwvc2VsZWN0Pic7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNoaXB0aW1pemVfY2hlY2tib3hlcyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmIChvcHRpb24uSWQgPT0ga2V5c1tpXSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbk5hbWUgPSBzaGlwdGltaXplX2NoZWNrYm94ZXNbb3B0aW9uLklkXTtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gc2hpcHRpbWl6ZV9vcHRpb25zW29wdGlvbk5hbWVdID09IG9wdGlvbi5JZCA/ICdjaGVja2VkJyA6ICcnO1xuICAgICAgICAgICAgaHRtbENoZWNrYm94ZXMgKz0gJzxzcGFuIGNsYXNzPVwid2JzLXNoaXB0aW1pemUtb3B0aW9uXCI+PGlucHV0ICcgKyBjaGVja2VkICsgJyBjbGFzcz1cIndicy1yc2UtY2hlY2tib3hcIiAgb25jaGFuZ2U9XCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIicgKyBvcHRpb25OYW1lICsgJ1wiIHZhbHVlPVwiJyArIG9wdGlvbi5JZCArICdcIi8+JyArIHNoaXB0aW1pemVfY2hlY2tib3hlc1tvcHRpb24uSWRdICsgXCI8L3NwYW4+XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGh0bWxTZXJ2aWNlTGV2ZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9IdG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPlwiICsgc2hpcHRpbWl6ZV9sYWJlbHMuc2VydmljZV9sZXZlbCArIFwiPC9sYWJlbD4gPHNlbGVjdCBuYW1lPVxcXCJzZXJ2aWNlX2xldmVsXFxcIiAgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPjxvcHRpb24+LTwvb3B0aW9uPlwiICsgaHRtbFNlcnZpY2VMZXZlbHMgKyBcIjwvc2VsZWN0Pjwvc3Bhbj5cIjtcbiAgICB9XG5cbiAgICBpZiAoaHRtbEV4dHJhT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBvSHRtbCArPSBcIjxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD5cIiArIHNoaXB0aW1pemVfbGFiZWxzLmV4dHJhb3B0aW9ucyArIFwiPC9sYWJlbD4gPHNlbGVjdCBjbGFzcz0nc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnMnIG5hbWU9XFxcImV4dHJhb3B0aW9uc1xcXCIgIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj48b3B0aW9uPi08L29wdGlvbj5cIiArIGh0bWxFeHRyYU9wdGlvbnMgKyBcIjwvc2VsZWN0PiBcIiArIGh0bWxFeHRyYXZhbHVlcysgXCIgPC9zcGFuPlwiO1xuICAgIH1cblxuICAgIG9IdG1sICs9IGh0bWxDaGVja2JveGVzO1xuXG4gICAgLy9QaWNrdXAgQmVoYXZpb3VyP1xuICAgIGlmKHNoaXB0aW1pemVfY2Fycmllci5IYXNQaWNrdXApIHtcbiAgICAgIGxldCBzZWxlY3RodG1sID0gJzxzZWxlY3QgY2xhc3M9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiIG5hbWU9XCJwaWNrdXBiZWhhdmlvdXJcIiBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+JztcbiAgICAgIGZvciAodmFyIHg9MDsgeCA8IDM7ICsreCkge1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ3BpY2t1cGJlaGF2aW91ciddID09IHggPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIHNlbGVjdGh0bWwgKz0gYDxvcHRpb24gdmFsdWU9XCIke3h9XCIgJHtzZWxlY3RlZH0+JHtzaGlwdGltaXplX2xhYmVsc1sncGlja3VwJyt4XX08L29wdGlvbj5gO1xuICAgICAgfVxuICAgICAgc2VsZWN0aHRtbCArPSAnPC9zZWxlY3Q+JztcblxuICAgICAgb0h0bWwgKz0gYDxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD4ke3NoaXB0aW1pemVfbGFiZWxzLnBpY2t1cGJlaGF2aW91cn08L2xhYmVsPiAke3NlbGVjdGh0bWx9PC9zcGFuPmA7XG4gICAgfSBcblxuXG4gICAgaWYgKG9IdG1sLmxlbmd0aCA+IDApIHtcbiAgICAgIGVTaGlwdGltaXplT3B0aW9ucy5odG1sKFwiPGgzPlNoaXB0aW1pemUgU2V0dGluZ3M8L2gzPlwiICsgb0h0bWwpO1xuICAgICAgZVNoaXB0aW1pemVPcHRpb25zLmluc2VydEFmdGVyKGpRdWVyeShcIiNtYWluZm9ybVwiKSk7XG4gICAgICB0aGlzLmVGb3JtID0galF1ZXJ5KFwiI3NoaXB0aW1pemVvcHRpb25zXCIpOyBcbiAgICAgIHRoaXMuc2F2ZU9wdGlvbnMoalF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12\n')}]);
     1/******/ (function(modules) { // webpackBootstrap
     2/******/    // The module cache
     3/******/    var installedModules = {};
     4/******/
     5/******/    // The require function
     6/******/    function __webpack_require__(moduleId) {
     7/******/
     8/******/        // Check if module is in cache
     9/******/        if(installedModules[moduleId]) {
     10/******/            return installedModules[moduleId].exports;
     11/******/        }
     12/******/        // Create a new module (and put it into the cache)
     13/******/        var module = installedModules[moduleId] = {
     14/******/            i: moduleId,
     15/******/            l: false,
     16/******/            exports: {}
     17/******/        };
     18/******/
     19/******/        // Execute the module function
     20/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     21/******/
     22/******/        // Flag the module as loaded
     23/******/        module.l = true;
     24/******/
     25/******/        // Return the exports of the module
     26/******/        return module.exports;
     27/******/    }
     28/******/
     29/******/
     30/******/    // expose the modules object (__webpack_modules__)
     31/******/    __webpack_require__.m = modules;
     32/******/
     33/******/    // expose the module cache
     34/******/    __webpack_require__.c = installedModules;
     35/******/
     36/******/    // define getter function for harmony exports
     37/******/    __webpack_require__.d = function(exports, name, getter) {
     38/******/        if(!__webpack_require__.o(exports, name)) {
     39/******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
     40/******/        }
     41/******/    };
     42/******/
     43/******/    // define __esModule on exports
     44/******/    __webpack_require__.r = function(exports) {
     45/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
     46/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
     47/******/        }
     48/******/        Object.defineProperty(exports, '__esModule', { value: true });
     49/******/    };
     50/******/
     51/******/    // create a fake namespace object
     52/******/    // mode & 1: value is a module id, require it
     53/******/    // mode & 2: merge all properties of value into the ns
     54/******/    // mode & 4: return value when already ns object
     55/******/    // mode & 8|1: behave like require
     56/******/    __webpack_require__.t = function(value, mode) {
     57/******/        if(mode & 1) value = __webpack_require__(value);
     58/******/        if(mode & 8) return value;
     59/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
     60/******/        var ns = Object.create(null);
     61/******/        __webpack_require__.r(ns);
     62/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
     63/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
     64/******/        return ns;
     65/******/    };
     66/******/
     67/******/    // getDefaultExport function for compatibility with non-harmony modules
     68/******/    __webpack_require__.n = function(module) {
     69/******/        var getter = module && module.__esModule ?
     70/******/            function getDefault() { return module['default']; } :
     71/******/            function getModuleExports() { return module; };
     72/******/        __webpack_require__.d(getter, 'a', getter);
     73/******/        return getter;
     74/******/    };
     75/******/
     76/******/    // Object.prototype.hasOwnProperty.call
     77/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
     78/******/
     79/******/    // __webpack_public_path__
     80/******/    __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js";
     81/******/
     82/******/
     83/******/    // Load entry module and return exports
     84/******/    return __webpack_require__(__webpack_require__.s = "./shiptimize-admin.js");
     85/******/ })
     86/************************************************************************/
     87/******/ ({
     88
     89/***/ "./js/shiptimize-utils.js":
     90/*!********************************!*\
     91  !*** ./js/shiptimize-utils.js ***!
     92  \********************************/
     93/*! no static exports found */
     94/***/ (function(module, exports, __webpack_require__) {
     95
     96"use strict";
     97eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n  function ShiptimizeUtils() {\n    _classCallCheck(this, ShiptimizeUtils);\n  }\n\n  /** \n   * Inject Script into the page \n   * @param string src \n   */\n\n\n  _createClass(ShiptimizeUtils, [{\n    key: \"injectExternalScript\",\n    value: function injectExternalScript(src) {\n      var s = document.createElement(\"script\");\n      s.setAttribute(\"src\", src);\n      document.body.appendChild(s);\n    }\n\n    /** \n     * Inject a script string \n     */\n\n  }, {\n    key: \"injectScript\",\n    value: function injectScript(contents) {\n      var e = document.createElement(\"script\");\n      e.value = contents;\n      document.body.appendChild(e);\n    }\n\n    /** \n     * Removes all not numeric chars from the string \n     *\n     * @param string string - the input string \n     * @return the string without chars that are not numbers \n     */\n\n  }, {\n    key: \"removeNonNumeric\",\n    value: function removeNonNumeric(string) {\n      return string.replace(/\\D/g, '');\n    }\n\n    /** \n     * Check if the given url exists and is valid\n     * We use this to check if the carrier icon exists given \n     * a url path and the naming convention {carrier_id}.svg \n     * Make sure the correct protocol is appended to the url http != https \n     * \n     * @return true it the url exists and is valid \n     */\n\n  }, {\n    key: \"isUrlValid\",\n    value: function isUrlValid(url) {\n      var http = new XMLHttpRequest();\n      http.open('HEAD', url, false);\n      http.send();\n      return http.status == 200;\n    }\n\n    /** \n     * Open a new window with the provided URL \n     * @string url \n     * @return bool if the window was opened, false if popup blocker enabled \n     */\n\n  }, {\n    key: \"openNewWindow\",\n    value: function openNewWindow(url, options) {\n      var newWin = window.open(url, '_blank', options);\n      var blocked = !newWin || newWin.closed || typeof newWin.closed == 'undefined';\n\n      return !blocked;\n    }\n  }]);\n\n  return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS11dGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2UgY2FuIHVzZSBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3R1ZmYgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemVVdGlscyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBTY3JpcHQgaW50byB0aGUgcGFnZSBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHNyYyBcbiAgICAgKi9cbiAgICBpbmplY3RFeHRlcm5hbFNjcmlwdChzcmMpIHtcbiAgICAgICAgbGV0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBhIHNjcmlwdCBzdHJpbmcgXG4gICAgICovXG4gICAgaW5qZWN0U2NyaXB0KGNvbnRlbnRzKSB7XG4gICAgICAgIGxldCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgZS52YWx1ZSA9IGNvbnRlbnRzO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZW1vdmVzIGFsbCBub3QgbnVtZXJpYyBjaGFycyBmcm9tIHRoZSBzdHJpbmcgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgXG4gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhcnMgdGhhdCBhcmUgbm90IG51bWJlcnMgXG4gICAgICovXG4gICAgcmVtb3ZlTm9uTnVtZXJpYyhzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICAgKiBXZSB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgY2FycmllciBpY29uIGV4aXN0cyBnaXZlbiBcbiAgICAgKiBhIHVybCBwYXRoIGFuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24ge2NhcnJpZXJfaWR9LnN2ZyBcbiAgICAgKiBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgcHJvdG9jb2wgaXMgYXBwZW5kZWQgdG8gdGhlIHVybCBodHRwICE9IGh0dHBzIFxuICAgICAqIFxuICAgICAqIEByZXR1cm4gdHJ1ZSBpdCB0aGUgdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWQgXG4gICAgICovIFxuICAgIGlzVXJsVmFsaWQodXJsKSB7XG4gICAgICAgIHZhciBodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHAub3BlbignSEVBRCcsIHVybCwgZmFsc2UpO1xuICAgICAgICBodHRwLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuIGh0dHAuc3RhdHVzID09IDIwMDtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogT3BlbiBhIG5ldyB3aW5kb3cgd2l0aCB0aGUgcHJvdmlkZWQgVVJMIFxuICAgICAqIEBzdHJpbmcgdXJsIFxuICAgICAqIEByZXR1cm4gYm9vbCBpZiB0aGUgd2luZG93IHdhcyBvcGVuZWQsIGZhbHNlIGlmIHBvcHVwIGJsb2NrZXIgZW5hYmxlZCBcbiAgICAgKi8gIFxuICAgIG9wZW5OZXdXaW5kb3codXJsLCBvcHRpb25zKXtcbiAgICAgICAgbGV0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsIG9wdGlvbnMpOyBcbiAgICAgICAgbGV0IGJsb2NrZWQgPSAhbmV3V2luIHx8IG5ld1dpbi5jbG9zZWQgfHwgdHlwZW9mIG5ld1dpbi5jbG9zZWQ9PSd1bmRlZmluZWQnOyBcblxuICAgICAgICByZXR1cm4gIWJsb2NrZWQ7IFxuICAgIH1cbn1cblxuXG5sZXQgdXRpbHMgPSBuZXcgU2hpcHRpbWl6ZVV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlsczsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-utils.js\n");
     98
     99/***/ }),
     100
     101/***/ "./js/shiptimize-weight-based-shipping.js":
     102/*!************************************************!*\
     103  !*** ./js/shiptimize-weight-based-shipping.js ***!
     104  \************************************************/
     105/*! no static exports found */
     106/***/ (function(module, exports, __webpack_require__) {
     107
     108"use strict";
     109eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * plug into the  dom and  append shiptimize settings\n * Save on change via ajax \n * We can't save rule by rule withough pluggin into the checkout \n * Currently only the instance id is saved \n */\nvar ShiptimizeWeightBasedShipping = function () {\n  function ShiptimizeWeightBasedShipping() {\n    _classCallCheck(this, ShiptimizeWeightBasedShipping);\n\n    console.log(\"Shiptimize options for WeightBasedShipping\");\n    this.init();\n  }\n\n  _createClass(ShiptimizeWeightBasedShipping, [{\n    key: \"init\",\n    value: function init() {\n      //not a shipping method page \n      if (typeof shiptimize_carrier == 'undefined') {\n        return;\n      }\n\n      var regexInstance = /instance_id=([0-9]*)/.exec(window.location.search);\n\n      if (!regexInstance) {\n        console.log(\"invalid url params cannot find instance_id \" + window.location.search);\n        return;\n      }\n\n      this.instance_id = regexInstance[1];\n      this.attachShiptimizeOptions();\n    }\n\n    /** \n     * Save our options for this instance \n     */\n\n  }, {\n    key: \"saveOptions\",\n    value: function saveOptions(elem) {\n      var data = {\n        'data': this.eForm.serializeArray(),\n        'instance_id': this.instance_id,\n        'action': 'shiptimize_wbs_settings'\n      };\n\n      jQuery.post(ajaxurl, data, function (resp) {\n        console.log(\"response \", resp);\n      });\n\n      console.log(this.eForm, \"Saveoptions \", data);\n\n      jQuery(\".shiptimize-optionvalues\").hide();\n      var extraOption = jQuery(\".shiptimize-extraoptions\").val();\n      jQuery(\"#shiptimize-extraoptions\" + extraOption).show();\n    }\n\n    /** \n     * Attach the shiptimize options under the title   \n     */\n\n  }, {\n    key: \"attachShiptimizeOptions\",\n    value: function attachShiptimizeOptions() {\n\n      var eShiptimizeOptions = jQuery(\"<form id='shiptimizeoptions' class=\\\"wbs-shiptimizeoptions\\\"></form>\");\n      var oHtml = '';\n\n      //no options , nothing to do \n      if (typeof shiptimize_carrier.OptionList == 'undefined') {\n        return;\n      }\n\n      //shiptimize_extraoptions\n      //shiptimize_checkboxes\n      //Add a Save button \n      var htmlServiceLevels = '';\n      var htmlExtraOptions = '';\n      var htmlCheckboxes = '';\n      var htmlExtravalues = '';\n      for (var x = 0; x < shiptimize_carrier.OptionList.length; ++x) {\n        var option = shiptimize_carrier.OptionList[x];\n\n        if (option.Type == 1) {\n          if (typeof option.OptionValues != 'undefined') {\n            for (var i = 0; i < option.OptionValues.length; ++i) {\n              var optionChild = option.OptionValues[i];\n              var selected = shiptimize_options['service_level'] == optionChild.Id ? 'selected' : '';\n              htmlServiceLevels += \"<option value='\" + optionChild.Id + \"' \" + selected + \">\" + optionChild.Name + \"</option>\";\n            }\n          }\n        } else if (shiptimize_extraoptions.includes(option.Id + \"\")) {\n          var _selected = shiptimize_options['extraoptions'] == option.Id ? 'selected' : '';\n          htmlExtraOptions += \"<option value='\" + option.Id + \"' \" + _selected + \">\" + option.Name + \"</option>\";\n          if (option.OptionFields && option.OptionFields.length > 0) {\n            for (var j = 0; j < option.OptionFields.length; ++j) {\n              if (option.OptionFields[j].OptionValues) {\n                var optionField = option.OptionFields[j];\n                htmlExtravalues += '<select class=\"shiptimize-optionvalues\" id=\"shiptimize-extraoptions' + option.Id + '\" name=\"extraoptions' + option.Id + '\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\">';\n                for (var i = 0; i < optionField.OptionValues.length; ++i) {\n                  var _optionChild = optionField.OptionValues[i];\n                  var _selected2 = shiptimize_options['extraoptionvalue' + option.Id] == _optionChild.Id ? 'selected' : '';\n                  htmlExtravalues += \"<option value='\" + _optionChild.Id + \"' \" + _selected2 + \">\" + _optionChild.Name + \"</option>\";\n                }\n                htmlExtravalues += '</select>';\n              }\n            }\n          }\n        } else {\n          var keys = Object.keys(shiptimize_checkboxes);\n          for (var i = 0; i < keys.length; ++i) {\n            if (option.Id == keys[i]) {\n              var optionName = shiptimize_checkboxes[option.Id];\n              var checked = shiptimize_options[optionName] == option.Id ? 'checked' : '';\n              htmlCheckboxes += '<span class=\"wbs-shiptimize-option\"><input ' + checked + ' class=\"wbs-rse-checkbox\"  onchange=\"shiptimize.platform.wbs.saveOptions(jQuery(this))\" type=\"checkbox\" name=\"' + optionName + '\" value=\"' + option.Id + '\"/>' + shiptimize_checkboxes[option.Id] + \"</span>\";\n            }\n          }\n        }\n      }\n\n      if (htmlServiceLevels.length > 0) {\n        oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.service_level + \"</label> <select name=\\\"service_level\\\"  onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\"><option>-</option>\" + htmlServiceLevels + \"</select></span>\";\n      }\n\n      if (htmlExtraOptions.length > 0) {\n        oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.extraoptions + \"</label> <select class='shiptimize-extraoptions' name=\\\"extraoptions\\\"  onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\"><option>-</option>\" + htmlExtraOptions + \"</select> \" + htmlExtravalues + \" </span>\";\n      }\n\n      oHtml += htmlCheckboxes;\n\n      //Pickup Behaviour?\n      if (shiptimize_carrier.HasPickup) {\n        var selecthtml = '<select class=\"shiptimize-extraoptions\" name=\"pickupbehaviour\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\">';\n        for (var x = 0; x < 3; ++x) {\n          var _selected3 = shiptimize_options['pickupbehaviour'] == x ? 'selected' : '';\n          selecthtml += \"<option value=\\\"\" + x + \"\\\" \" + _selected3 + \">\" + shiptimize_labels['pickup' + x] + \"</option>\";\n        }\n        selecthtml += '</select>';\n\n        oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.pickupbehaviour + \"</label> \" + selecthtml + \"</span>\";\n      }\n\n      if (oHtml.length > 0) {\n        eShiptimizeOptions.html(\"<h3>Shiptimize Settings</h3>\" + oHtml);\n        eShiptimizeOptions.insertAfter(jQuery(\"#mainform\"));\n        this.eForm = jQuery(\"#shiptimizeoptions\");\n        this.saveOptions(jQuery(\".shiptimize-extraoptions\"));\n      }\n    }\n  }]);\n\n  return ShiptimizeWeightBasedShipping;\n}();\n\nexports.default = ShiptimizeWeightBasedShipping;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlX2xldmVsIiwiZXh0cmFvcHRpb25zIiwiSGFzUGlja3VwIiwic2VsZWN0aHRtbCIsInBpY2t1cGJlaGF2aW91ciIsImh0bWwiLCJpbnNlcnRBZnRlciIsInNhdmVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7OztJQU1xQkEsNkI7QUFFbkIs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QUFkOztBQUVBL0IsbUVBQXlEMkIsa0JBQWtCSyxlQUEzRSxpQkFBc0dELFVBQXRHO0FBQ0Q7O0FBR0QsVUFBSS9CLE1BQU1PLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNwQlIsMkJBQW1Ca0MsSUFBbkIsQ0FBd0IsaUNBQWlDakMsS0FBekQ7QUFDQUQsMkJBQW1CbUMsV0FBbkIsQ0FBK0IzQyxPQUFPLFdBQVAsQ0FBL0I7QUFDQSxhQUFLRixLQUFMLEdBQWFFLE9BQU8sb0JBQVAsQ0FBYjtBQUNBLGFBQUs0QyxXQUFMLENBQWlCNUMsT0FBTywwQkFBUCxDQUFqQjtBQUNEO0FBRUY7Ozs7OztrQkF6SWtCaEIsNkIiLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIHBsdWcgaW50byB0aGUgIGRvbSBhbmQgIGFwcGVuZCBzaGlwdGltaXplIHNldHRpbmdzXG4gKiBTYXZlIG9uIGNoYW5nZSB2aWEgYWpheCBcbiAqIFdlIGNhbid0IHNhdmUgcnVsZSBieSBydWxlIHdpdGhvdWdoIHBsdWdnaW4gaW50byB0aGUgY2hlY2tvdXQgXG4gKiBDdXJyZW50bHkgb25seSB0aGUgaW5zdGFuY2UgaWQgaXMgc2F2ZWQgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNoaXB0aW1pemUgb3B0aW9ucyBmb3IgV2VpZ2h0QmFzZWRTaGlwcGluZ1wiKTtcbiAgICB0aGlzLmluaXQoKTtcblxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICAvL25vdCBhIHNoaXBwaW5nIG1ldGhvZCBwYWdlIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2FycmllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWdleEluc3RhbmNlID0gL2luc3RhbmNlX2lkPShbMC05XSopLy5leGVjKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgaWYgKCFyZWdleEluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImludmFsaWQgdXJsIHBhcmFtcyBjYW5ub3QgZmluZCBpbnN0YW5jZV9pZCBcIiArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VfaWQgPSByZWdleEluc3RhbmNlWzFdO1xuICAgIHRoaXMuYXR0YWNoU2hpcHRpbWl6ZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBcbiAgICogU2F2ZSBvdXIgb3B0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZSBcbiAgICovXG4gIHNhdmVPcHRpb25zKGVsZW0pIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdkYXRhJzogdGhpcy5lRm9ybS5zZXJpYWxpemVBcnJheSgpLFxuICAgICAgJ2luc3RhbmNlX2lkJzogdGhpcy5pbnN0YW5jZV9pZCxcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93YnNfc2V0dGluZ3MnXG4gICAgfTtcblxuICAgIGpRdWVyeS5wb3N0KGFqYXh1cmwsIGRhdGEsIGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcInJlc3BvbnNlIFwiLCByZXNwKTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZUZvcm0sIFwiU2F2ZW9wdGlvbnMgXCIsIGRhdGEpO1xuICAgIFxuICAgIGpRdWVyeShcIi5zaGlwdGltaXplLW9wdGlvbnZhbHVlc1wiKS5oaWRlKCk7XG4gICAgdmFyIGV4dHJhT3B0aW9uID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpLnZhbCgpOyBcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIitleHRyYU9wdGlvbikuc2hvdygpO1xuICAgICBcbiAgfVxuXG4gIC8qKiBcbiAgICogQXR0YWNoIHRoZSBzaGlwdGltaXplIG9wdGlvbnMgdW5kZXIgdGhlIHRpdGxlICAgXG4gICAqL1xuICBhdHRhY2hTaGlwdGltaXplT3B0aW9ucygpIHtcblxuICAgIHZhciBlU2hpcHRpbWl6ZU9wdGlvbnMgPSBqUXVlcnkoXCI8Zm9ybSBpZD0nc2hpcHRpbWl6ZW9wdGlvbnMnIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZW9wdGlvbnNcXFwiPjwvZm9ybT5cIik7XG4gICAgdmFyIG9IdG1sID0gJyc7XG5cbiAgICAvL25vIG9wdGlvbnMgLCBub3RoaW5nIHRvIGRvIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0KSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vc2hpcHRpbWl6ZV9leHRyYW9wdGlvbnNcbiAgICAvL3NoaXB0aW1pemVfY2hlY2tib3hlc1xuICAgIC8vQWRkIGEgU2F2ZSBidXR0b24gXG4gICAgbGV0IGh0bWxTZXJ2aWNlTGV2ZWxzID0gJyc7XG4gICAgbGV0IGh0bWxFeHRyYU9wdGlvbnMgPSAnJztcbiAgICBsZXQgaHRtbENoZWNrYm94ZXMgPSAnJztcbiAgICBsZXQgaHRtbEV4dHJhdmFsdWVzID0gJyc7IFxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgc2hpcHRpbWl6ZV9jYXJyaWVyLk9wdGlvbkxpc3QubGVuZ3RoOyArK3gpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0W3hdO1xuXG4gICAgICBpZiAob3B0aW9uLlR5cGUgPT0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIChvcHRpb24uT3B0aW9uVmFsdWVzKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbkNoaWxkID0gb3B0aW9uLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snc2VydmljZV9sZXZlbCddID09IG9wdGlvbkNoaWxkLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICAgICAgaHRtbFNlcnZpY2VMZXZlbHMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGlwdGltaXplX2V4dHJhb3B0aW9ucy5pbmNsdWRlcyhvcHRpb24uSWQrXCJcIikpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydleHRyYW9wdGlvbnMnXSA9PSBvcHRpb24uSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIGh0bWxFeHRyYU9wdGlvbnMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbi5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb24uTmFtZSArIFwiPC9vcHRpb24+XCI7XG4gICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzICYmIG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoPjApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgaj0wOyBqPG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzW2pdLk9wdGlvblZhbHVlcykgeyBcbiAgICAgICAgICAgICAgdmFyIG9wdGlvbkZpZWxkID0gb3B0aW9uLk9wdGlvbkZpZWxkc1tqXTsgXG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPHNlbGVjdCBjbGFzcz1cInNoaXB0aW1pemUtb3B0aW9udmFsdWVzXCIgaWQ9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgbmFtZT1cImV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPic7IFxuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb25DaGlsZCA9IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ2V4dHJhb3B0aW9udmFsdWUnICsgb3B0aW9uLklkXSA9PSBvcHRpb25DaGlsZC5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPC9zZWxlY3Q+JzsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2hpcHRpbWl6ZV9jaGVja2JveGVzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5JZCA9PSBrZXlzW2ldKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9uTmFtZSA9IHNoaXB0aW1pemVfY2hlY2tib3hlc1tvcHRpb24uSWRdO1xuICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBzaGlwdGltaXplX29wdGlvbnNbb3B0aW9uTmFtZV0gPT0gb3B0aW9uLklkID8gJ2NoZWNrZWQnIDogJyc7XG4gICAgICAgICAgICBodG1sQ2hlY2tib3hlcyArPSAnPHNwYW4gY2xhc3M9XCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cIj48aW5wdXQgJyArIGNoZWNrZWQgKyAnIGNsYXNzPVwid2JzLXJzZS1jaGVja2JveFwiICBvbmNoYW5nZT1cInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiJyArIG9wdGlvbk5hbWUgKyAnXCIgdmFsdWU9XCInICsgb3B0aW9uLklkICsgJ1wiLz4nICsgc2hpcHRpbWl6ZV9jaGVja2JveGVzW29wdGlvbi5JZF0gKyBcIjwvc3Bhbj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHRtbFNlcnZpY2VMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgb0h0bWwgKz0gXCI8c3BhbiBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemUtb3B0aW9uXFxcIj48bGFiZWw+XCIgKyBzaGlwdGltaXplX2xhYmVscy5zZXJ2aWNlX2xldmVsICsgXCI8L2xhYmVsPiA8c2VsZWN0IG5hbWU9XFxcInNlcnZpY2VfbGV2ZWxcXFwiICBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+PG9wdGlvbj4tPC9vcHRpb24+XCIgKyBodG1sU2VydmljZUxldmVscyArIFwiPC9zZWxlY3Q+PC9zcGFuPlwiO1xuICAgIH1cblxuICAgIGlmIChodG1sRXh0cmFPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIG9IdG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPlwiICsgc2hpcHRpbWl6ZV9sYWJlbHMuZXh0cmFvcHRpb25zICsgXCI8L2xhYmVsPiA8c2VsZWN0IGNsYXNzPSdzaGlwdGltaXplLWV4dHJhb3B0aW9ucycgbmFtZT1cXFwiZXh0cmFvcHRpb25zXFxcIiAgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPjxvcHRpb24+LTwvb3B0aW9uPlwiICsgaHRtbEV4dHJhT3B0aW9ucyArIFwiPC9zZWxlY3Q+IFwiICsgaHRtbEV4dHJhdmFsdWVzKyBcIiA8L3NwYW4+XCI7XG4gICAgfVxuXG4gICAgb0h0bWwgKz0gaHRtbENoZWNrYm94ZXM7XG5cbiAgICAvL1BpY2t1cCBCZWhhdmlvdXI/XG4gICAgaWYoc2hpcHRpbWl6ZV9jYXJyaWVyLkhhc1BpY2t1cCkge1xuICAgICAgbGV0IHNlbGVjdGh0bWwgPSAnPHNlbGVjdCBjbGFzcz1cInNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIgbmFtZT1cInBpY2t1cGJlaGF2aW91clwiIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj4nO1xuICAgICAgZm9yICh2YXIgeD0wOyB4IDwgMzsgKyt4KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1sncGlja3VwYmVoYXZpb3VyJ10gPT0geCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgc2VsZWN0aHRtbCArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7eH1cIiAke3NlbGVjdGVkfT4ke3NoaXB0aW1pemVfbGFiZWxzWydwaWNrdXAnK3hdfTwvb3B0aW9uPmA7XG4gICAgICB9XG4gICAgICBzZWxlY3RodG1sICs9ICc8L3NlbGVjdD4nO1xuXG4gICAgICBvSHRtbCArPSBgPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPiR7c2hpcHRpbWl6ZV9sYWJlbHMucGlja3VwYmVoYXZpb3VyfTwvbGFiZWw+ICR7c2VsZWN0aHRtbH08L3NwYW4+YDtcbiAgICB9IFxuXG5cbiAgICBpZiAob0h0bWwubGVuZ3RoID4gMCkge1xuICAgICAgZVNoaXB0aW1pemVPcHRpb25zLmh0bWwoXCI8aDM+U2hpcHRpbWl6ZSBTZXR0aW5nczwvaDM+XCIgKyBvSHRtbCk7XG4gICAgICBlU2hpcHRpbWl6ZU9wdGlvbnMuaW5zZXJ0QWZ0ZXIoalF1ZXJ5KFwiI21haW5mb3JtXCIpKTtcbiAgICAgIHRoaXMuZUZvcm0gPSBqUXVlcnkoXCIjc2hpcHRpbWl6ZW9wdGlvbnNcIik7IFxuICAgICAgdGhpcy5zYXZlT3B0aW9ucyhqUXVlcnkoXCIuc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIikpO1xuICAgIH1cblxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-weight-based-shipping.js\n");
     110
     111/***/ }),
     112
     113/***/ "./js/shiptimize-woo-commerce-admin.js":
     114/*!*********************************************!*\
     115  !*** ./js/shiptimize-woo-commerce-admin.js ***!
     116  \*********************************************/
     117/*! no static exports found */
     118/***/ (function(module, exports, __webpack_require__) {
     119
     120"use strict";
     121eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWeightBasedShipping = __webpack_require__(/*! ./shiptimize-weight-based-shipping.js */ \"./js/shiptimize-weight-based-shipping.js\");\n\nvar _shiptimizeWeightBasedShipping2 = _interopRequireDefault(_shiptimizeWeightBasedShipping);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar WooShipitmizeAdmin = function () {\n    function WooShipitmizeAdmin() {\n        _classCallCheck(this, WooShipitmizeAdmin);\n\n        this.wbs = new _shiptimizeWeightBasedShipping2.default();\n    }\n\n    _createClass(WooShipitmizeAdmin, [{\n        key: 'bootstrap',\n        value: function bootstrap() {\n            this.urlParams();\n        }\n\n        /** \n         * If the export was successfull \n         * @param string appLink - the login url \n         */\n\n    }, {\n        key: 'exportSuccess',\n        value: function exportSuccess(appLink) {\n            if (appLink.trim().length == 0) {\n                return;\n            }\n\n            _shiptimizeUtils2.default.openNewWindow(appLink, '');\n        }\n\n        /** \n         * @param int id - the carrier id \n         */\n\n    }, {\n        key: 'getCarrier',\n        value: function getCarrier(id) {\n            for (var x = 0; x < shiptimize_carriers.length; ++x) {\n                if (shiptimize_carriers[x].Id == id) {\n                    return shiptimize_carriers[x];\n                }\n            }\n        }\n\n        /** \n         * Show aditional options for carrier \n         */\n\n    }, {\n        key: 'selectOptions',\n        value: function selectOptions(elem) {\n            this.selectServiceLevel(elem, jQuery('.shiptimize__service-level').val());\n            // hide the extra options for now \n            // this.selectExtraOptions(elem, jQuery('.shiptimize__extra-options').val());\n        }\n\n        /** \n         * @param DomElement  elem - the carrier select \n         */\n\n    }, {\n        key: 'selectServiceLevel',\n        value: function selectServiceLevel(elem, service_id) {\n            var carrier_id = elem.val();\n            var carrier = this.getCarrier(carrier_id);\n            var eServiceLevel = elem.siblings(\".shiptimize__service-level\");\n\n            var options_html = '';\n\n            if (_typeof(carrier.OptionList) != undefined) {\n                var options = carrier.OptionList;\n\n                for (var x = 0; x < options.length; ++x) {\n                    if (options[x].Type == 1 && typeof options[x].OptionValues != 'undefined') {\n                        var values = options[x].OptionValues;\n                        options_html += \"<option>-</option>\";\n                        for (var i = 0; i < values.length; ++i) {\n                            var selected = service_id == values[i].Id ? 'selected' : '';\n                            options_html += \"<option value='\" + values[i].Id + \"' \" + selected + \" >\" + values[i].Name + \"</option>\";\n                        }\n                    }\n                }\n            }\n\n            eServiceLevel.html(options_html);\n            if (options_html) {\n                eServiceLevel.addClass(\"active\");\n            } else {\n                eServiceLevel.removeClass(\"active\");\n            }\n        }\n    }, {\n        key: 'selectExtraOptions',\n        value: function selectExtraOptions(elem, selected_id) {\n            var carrier_id = elem.val();\n            var carrier = this.getCarrier(carrier_id);\n            var eExtraoptions = elem.siblings(\".shiptimize__extra-options\");\n\n            var options_html = '';\n            var option_values_html = [];\n\n            if (_typeof(carrier.OptionList) != undefined) {\n                var options = carrier.OptionList;\n                for (var x = 0; x < options.length; ++x) {\n                    if (options[x].Type == 0) {\n                        if (!options_html) {\n                            options_html += \"<option>-</option>\";\n                        }\n                        var selected = selected_id == options[x].Id ? 'selected' : '';\n                        options_html += \"<option value='\" + options[x].Id + \"' \" + selected + \" >\" + options[x].Name + \"</option>\";\n                    }\n\n                    if (options[x].OptionValues && options[x].OptionValues.length > 0) {\n                        var vhtml = '<select id=\"shiptimize-optionvalues' + options[x].Id + '\" class=\"shiptimize__optionvalues\">';\n                        for (var j = 0; j < options[x].OptionValues.length; ++j) {\n                            vhtml += '<option>' + options[x].OptionValues[j] + '</options>';\n                        }\n\n                        vhtml += '<select>';\n                    }\n                }\n            }\n\n            eExtraoptions.html(options_html);\n            if (options_html) {\n                eExtraoptions.addClass(\"active\");\n            } else {\n                eExtraoptions.removeClass(\"active\");\n            }\n        }\n    }, {\n        key: 'selectTab',\n        value: function selectTab(idx) {\n            jQuery(\".nav-tab\").removeClass('nav-tab-active');\n            jQuery(jQuery(\".nav-tab\").get(idx)).addClass('nav-tab-active');\n\n            jQuery(\".tab\").removeClass('active');\n            jQuery(jQuery(\".tab\").get(idx)).addClass('active');\n        }\n    }, {\n        key: 'accordion',\n        value: function accordion(elem) {\n            var $eparent = jQuery(elem).parent();\n            if ($eparent.hasClass('open')) {\n                $eparent.removeClass('open');\n            } else {\n                $eparent.addClass('open');\n            }\n        }\n\n        /** \n        * Is there stuff in the url params we care about? \n        **/\n\n    }, {\n        key: 'urlParams',\n        value: function urlParams() {\n            var parts = document.location.search.split('&');\n            for (var x = 0; x < parts.length; ++x) {\n                var keyval = parts[x].split('=');\n                var key = keyval[0];\n                var value = decodeURIComponent(keyval[1]);\n\n                if (key == 'CallbackURL') {\n                    console.log(\"We are creating a label\");\n                    shiptimize.openLoader(shiptimize_label_request);\n                    shiptimize.monitorLabelStatus(value);\n                }\n            }\n        }\n    }]);\n\n    return WooShipitmizeAdmin;\n}();\n\nexports.default = WooShipitmizeAdmin;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcz80MDA5Il0sIm5hbWVzIjpbIldvb1NoaXBpdG1pemVBZG1pbiIsIndicyIsIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwidXJsUGFyYW1zIiwiYXBwTGluayIsInRyaW0iLCJsZW5ndGgiLCJVdGlscyIsIm9wZW5OZXdXaW5kb3ciLCJpZCIsIngiLCJzaGlwdGltaXplX2NhcnJpZXJzIiwiSWQiLCJlbGVtIiwic2VsZWN0U2VydmljZUxldmVsIiwialF1ZXJ5IiwidmFsIiwic2VydmljZV9pZCIsImNhcnJpZXJfaWQiLCJjYXJyaWVyIiwiZ2V0Q2FycmllciIsImVTZXJ2aWNlTGV2ZWwiLCJzaWJsaW5ncyIsIm9wdGlvbnNfaHRtbCIsIk9wdGlvbkxpc3QiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwiVHlwZSIsIk9wdGlvblZhbHVlcyIsInZhbHVlcyIsImkiLCJzZWxlY3RlZCIsIk5hbWUiLCJodG1sIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNlbGVjdGVkX2lkIiwiZUV4dHJhb3B0aW9ucyIsIm9wdGlvbl92YWx1ZXNfaHRtbCIsInZodG1sIiwiaiIsImlkeCIsImdldCIsIiRlcGFyZW50IiwicGFyZW50IiwiaGFzQ2xhc3MiLCJwYXJ0cyIsImRvY3VtZW50IiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGxpdCIsImtleXZhbCIsImtleSIsInZhbHVlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiY29uc29sZSIsImxvZyIsInNoaXB0aW1pemUiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwibW9uaXRvckxhYmVsU3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLGtCO0FBRWpCLGtDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsR0FBTCxHQUFXLElBQUlDLHVDQUFKLEVBQVg7QUFD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bW1lcmNlLWFkbWluLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7IFxuaW1wb3J0IFNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIGZyb20gJy4vc2hpcHRpbWl6ZS13ZWlnaHQtYmFzZWQtc2hpcHBpbmcuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb29TaGlwaXRtaXplQWRtaW4geyAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLndicyA9IG5ldyBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZygpO1xuICAgIH1cblxuICAgIGJvb3RzdHJhcCgpIHsgXG4gICAgICAgIHRoaXMudXJsUGFyYW1zKCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIElmIHRoZSBleHBvcnQgd2FzIHN1Y2Nlc3NmdWxsIFxuICAgICAqIEBwYXJhbSBzdHJpbmcgYXBwTGluayAtIHRoZSBsb2dpbiB1cmwgXG4gICAgICovXG4gICAgZXhwb3J0U3VjY2VzcyhhcHBMaW5rKSB7XG4gICAgICAgIGlmKGFwcExpbmsudHJpbSgpLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICAgIHJldHVybjsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIFV0aWxzLm9wZW5OZXdXaW5kb3coYXBwTGluaywgJycpOyBcbiAgICB9IFxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBpbnQgaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi8gXG4gICAgZ2V0Q2FycmllcihpZCl7XG4gICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgc2hpcHRpbWl6ZV9jYXJyaWVycy5sZW5ndGg7ICsreCApe1xuICAgICAgICAgICAgaWYoc2hpcHRpbWl6ZV9jYXJyaWVyc1t4XS5JZCA9PSBpZCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNoaXB0aW1pemVfY2FycmllcnNbeF07IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgYWRpdGlvbmFsIG9wdGlvbnMgZm9yIGNhcnJpZXIgXG4gICAgICovIFxuICAgIHNlbGVjdE9wdGlvbnMoZWxlbSl7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VydmljZUxldmVsKGVsZW0sIGpRdWVyeSgnLnNoaXB0aW1pemVfX3NlcnZpY2UtbGV2ZWwnKS52YWwoKSk7IFxuICAgICAgICAvLyBoaWRlIHRoZSBleHRyYSBvcHRpb25zIGZvciBub3cgXG4gICAgICAgIC8vIHRoaXMuc2VsZWN0RXh0cmFPcHRpb25zKGVsZW0sIGpRdWVyeSgnLnNoaXB0aW1pemVfX2V4dHJhLW9wdGlvbnMnKS52YWwoKSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBEb21FbGVtZW50ICBlbGVtIC0gdGhlIGNhcnJpZXIgc2VsZWN0IFxuICAgICAqLyBcbiAgICBzZWxlY3RTZXJ2aWNlTGV2ZWwoIGVsZW0gLCBzZXJ2aWNlX2lkICkge1xuICAgICAgICBsZXQgY2Fycmllcl9pZCA9IGVsZW0udmFsKCk7IFxuICAgICAgICBsZXQgY2FycmllciA9IHRoaXMuZ2V0Q2FycmllcihjYXJyaWVyX2lkKTsgXG4gICAgICAgIGxldCBlU2VydmljZUxldmVsID0gZWxlbS5zaWJsaW5ncyhcIi5zaGlwdGltaXplX19zZXJ2aWNlLWxldmVsXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zX2h0bWwgPSAnJztcblxuICAgICAgICBpZiggdHlwZW9mKGNhcnJpZXIuT3B0aW9uTGlzdCkgIT0gdW5kZWZpbmVkICl7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGNhcnJpZXIuT3B0aW9uTGlzdDsgXG5cbiAgICAgICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgb3B0aW9ucy5sZW5ndGg7ICsreCl7XG4gICAgICAgICAgICAgICAgaWYoIG9wdGlvbnNbeF0uVHlwZSA9PSAxICYmIHR5cGVvZihvcHRpb25zW3hdLk9wdGlvblZhbHVlcykgIT0gJ3VuZGVmaW5lZCcgKXsgIFxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfaHRtbCArPSBcIjxvcHRpb24+LTwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IoIGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSApe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2VydmljZV9pZCA9PSB2YWx1ZXNbaV0uSWQgPyAnc2VsZWN0ZWQnIDonJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIHZhbHVlc1tpXS5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCIgPlwiICsgdmFsdWVzW2ldLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZVNlcnZpY2VMZXZlbC5odG1sKG9wdGlvbnNfaHRtbCk7XG4gICAgICAgIGlmKG9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICBlU2VydmljZUxldmVsLmFkZENsYXNzKFwiYWN0aXZlXCIpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVTZXJ2aWNlTGV2ZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHNlbGVjdEV4dHJhT3B0aW9ucyggZWxlbSwgc2VsZWN0ZWRfaWQgKXsgbGV0IGNhcnJpZXJfaWQgPSBlbGVtLnZhbCgpOyBcbiAgICAgICAgbGV0IGNhcnJpZXIgPSB0aGlzLmdldENhcnJpZXIoY2Fycmllcl9pZCk7IFxuICAgICAgICBsZXQgZUV4dHJhb3B0aW9ucyA9IGVsZW0uc2libGluZ3MoXCIuc2hpcHRpbWl6ZV9fZXh0cmEtb3B0aW9uc1wiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc19odG1sID0gJyc7XG4gICAgICAgIGxldCBvcHRpb25fdmFsdWVzX2h0bWwgPSBbXTsgXG5cbiAgICAgICAgaWYoIHR5cGVvZihjYXJyaWVyLk9wdGlvbkxpc3QpICE9IHVuZGVmaW5lZCApe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBjYXJyaWVyLk9wdGlvbkxpc3Q7IFxuICAgICAgICAgICAgZm9yKCBsZXQgeCA9IDA7IHggPCBvcHRpb25zLmxlbmd0aDsgKyt4KXtcbiAgICAgICAgICAgICAgICBpZiggb3B0aW9uc1t4XS5UeXBlID09IDAgKXsgIFxuICAgICAgICAgICAgICAgICAgICBpZighb3B0aW9uc19odG1sKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfaHRtbCArPSBcIjxvcHRpb24+LTwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzZWxlY3RlZF9pZCA9PSBvcHRpb25zW3hdLklkID8gJ3NlbGVjdGVkJyA6Jyc7IFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbnNbeF0uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiID5cIiArIG9wdGlvbnNbeF0uTmFtZSArIFwiPC9vcHRpb24+XCI7IFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zW3hdLk9wdGlvblZhbHVlcyAmJiBvcHRpb25zW3hdLk9wdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aHRtbCA9ICc8c2VsZWN0IGlkPVwic2hpcHRpbWl6ZS1vcHRpb252YWx1ZXMnICsgb3B0aW9uc1t4XS5JZCArJ1wiIGNsYXNzPVwic2hpcHRpbWl6ZV9fb3B0aW9udmFsdWVzXCI+JztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZodG1sICs9ICc8b3B0aW9uPicgKyBvcHRpb25zW3hdLk9wdGlvblZhbHVlc1tqXSArICc8L29wdGlvbnM+JztcbiAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICB2aHRtbCArPSAnPHNlbGVjdD4nOyAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZUV4dHJhb3B0aW9ucy5odG1sKG9wdGlvbnNfaHRtbCk7XG4gICAgICAgIGlmKG9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICBlRXh0cmFvcHRpb25zLmFkZENsYXNzKFwiYWN0aXZlXCIpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVFeHRyYW9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIH0gXG4gICAgfSBcbiBcbiAgICBzZWxlY3RUYWIoaWR4KXtcbiAgICAgICAgalF1ZXJ5KFwiLm5hdi10YWJcIikucmVtb3ZlQ2xhc3MoJ25hdi10YWItYWN0aXZlJyk7XG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCIubmF2LXRhYlwiKS5nZXQoaWR4KSkuYWRkQ2xhc3MoJ25hdi10YWItYWN0aXZlJyk7IFxuXG4gICAgICAgIGpRdWVyeShcIi50YWJcIikucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOyBcbiAgICAgICAgalF1ZXJ5KGpRdWVyeShcIi50YWJcIikuZ2V0KGlkeCkpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBhY2NvcmRpb24oZWxlbSl7XG4gICAgICAgIGxldCAkZXBhcmVudCA9IGpRdWVyeShlbGVtKS5wYXJlbnQoKTsgXG4gICAgICAgIGlmICgkZXBhcmVudC5oYXNDbGFzcygnb3BlbicpKSB7XG4gICAgICAgICAgICAkZXBhcmVudC5yZW1vdmVDbGFzcygnb3BlbicpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICRlcGFyZW50LmFkZENsYXNzKCdvcGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogXG4gICAgKiBJcyB0aGVyZSBzdHVmZiBpbiB0aGUgdXJsIHBhcmFtcyB3ZSBjYXJlIGFib3V0PyBcbiAgICAqKi9cbiAgICB1cmxQYXJhbXMoKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zcGxpdCgnJicpOyBcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwYXJ0cy5sZW5ndGg7ICsreCkge1xuICAgICAgICAgIGxldCBrZXl2YWwgPSBwYXJ0c1t4XS5zcGxpdCgnPScpOyBcbiAgICAgICAgICBsZXQga2V5ID0ga2V5dmFsWzBdO1xuICAgICAgICAgIGxldCB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXl2YWxbMV0pOyBcblxuICAgICAgICAgIGlmKGtleSA9PSAnQ2FsbGJhY2tVUkwnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIldlIGFyZSBjcmVhdGluZyBhIGxhYmVsXCIpO1xuICAgICAgICAgICAgc2hpcHRpbWl6ZS5vcGVuTG9hZGVyKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCk7IFxuICAgICAgICAgICAgc2hpcHRpbWl6ZS5tb25pdG9yTGFiZWxTdGF0dXModmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-woo-commerce-admin.js\n");
     122
     123/***/ }),
     124
     125/***/ "./node_modules/popper.js/dist/esm/popper.js":
     126/*!***************************************************!*\
     127  !*** ./node_modules/popper.js/dist/esm/popper.js ***!
     128  \***************************************************/
     129/*! no static exports found */
     130/***/ (function(module, exports, __webpack_require__) {
     131
     132"use strict";
     133eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n  var called = false;\n  return function () {\n    if (called) {\n      return;\n    }\n    called = true;\n    window.Promise.resolve().then(function () {\n      called = false;\n      fn();\n    });\n  };\n}\n\nfunction taskDebounce(fn) {\n  var scheduled = false;\n  return function () {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(function () {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n  var getType = {};\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  var window = element.ownerDocument.defaultView;\n  var css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body;\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body;\n    case '#document':\n      return element.body;\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n\n  var _getStyleComputedProp = getStyleComputedProperty(element),\n      overflow = _getStyleComputedProp.overflow,\n      overflowX = _getStyleComputedProp.overflowX,\n      overflowY = _getStyleComputedProp.overflowY;\n\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  var noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  var offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  var nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n  var start = order ? element1 : element2;\n  var end = order ? element2 : element1;\n\n  // Get common ancestor container\n  var range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  var commonAncestorContainer = range.commonAncestorContainer;\n\n  // Both nodes are inside #document\n\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  var element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    var html = element.ownerDocument.documentElement;\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var scrollTop = getScroll(element, 'top');\n  var scrollLeft = getScroll(element, 'left');\n  var modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n  var sideA = axis === 'x' ? 'Left' : 'Top';\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n  var body = document.body;\n  var html = document.documentElement;\n  var computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle)\n  };\n}\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar defineProperty = function defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n  return _extends({}, offsets, {\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height\n  });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n  var rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      var scrollTop = getScroll(element, 'top');\n      var scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    } else {\n      rect = element.getBoundingClientRect();\n    }\n  } catch (e) {}\n\n  var result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top\n  };\n\n  // subtract scrollbar size from sizes\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  var width = sizes.width || element.clientWidth || result.width;\n  var height = sizes.height || element.clientHeight || result.height;\n\n  var horizScrollbar = element.offsetWidth - width;\n  var vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    var styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var isIE10 = isIE(10);\n  var isHTML = parent.nodeName === 'HTML';\n  var childrenRect = getBoundingClientRect(children);\n  var parentRect = getBoundingClientRect(parent);\n  var scrollParent = getScrollParent(children);\n\n  var styles = getStyleComputedProperty(parent);\n  var borderTopWidth = parseFloat(styles.borderTopWidth);\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if (fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  var offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    var marginTop = parseFloat(styles.marginTop);\n    var marginLeft = parseFloat(styles.marginLeft);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var html = element.ownerDocument.documentElement;\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  var scrollTop = !excludeScroll ? getScroll(html) : 0;\n  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  var offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width: width,\n    height: height\n  };\n\n  return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n  var nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  var parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  var el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n  // NOTE: 1 DOM access here\n\n  var boundaries = { top: 0, left: 0 };\n  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport') {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  } else {\n    // Handle other cases based on DOM element used as boundaries\n    var boundariesNode = void 0;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n          height = _getWindowSizes.height,\n          width = _getWindowSizes.width;\n\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  var isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n  boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n  return boundaries;\n}\n\nfunction getArea(_ref) {\n  var width = _ref.width,\n      height = _ref.height;\n\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n  var rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height\n    }\n  };\n\n  var sortedAreas = Object.keys(rects).map(function (key) {\n    return _extends({\n      key: key\n    }, rects[key], {\n      area: getArea(rects[key])\n    });\n  }).sort(function (a, b) {\n    return b.area - a.area;\n  });\n\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\n    var width = _ref2.width,\n        height = _ref2.height;\n    return width >= popper.clientWidth && height >= popper.clientHeight;\n  });\n\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n  var variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n  var window = element.ownerDocument.defaultView;\n  var styles = window.getComputedStyle(element);\n  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  var result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x\n  };\n  return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  var popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  var popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  var mainSide = isHoriz ? 'top' : 'left';\n  var secondarySide = isHoriz ? 'left' : 'top';\n  var measurement = isHoriz ? 'height' : 'width';\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(function (cur) {\n      return cur[prop] === value;\n    });\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  var match = find(arr, function (obj) {\n    return obj[prop] === value;\n  });\n  return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(function (modifier) {\n    if (modifier['function']) {\n      // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  var data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {}\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  data.positionFixed = this.options.positionFixed;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(function (_ref) {\n    var name = _ref.name,\n        enabled = _ref.enabled;\n    return enabled && name === modifierName;\n  });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (var i = 0; i < prefixes.length; i++) {\n    var prefix = prefixes[i];\n    var toCheck = prefix ? '' + prefix + upperProp : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n  var ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  var isBody = scrollParent.nodeName === 'BODY';\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  var scrollElement = getScrollParent(reference);\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n  }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(function (target) {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n  Object.keys(styles).forEach(function (prop) {\n    var unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function (prop) {\n    var value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n  // compute reference element offsets\n  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n  return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n  var round = Math.round,\n      floor = Math.floor;\n\n  var noRound = function noRound(v) {\n    return v;\n  };\n\n  var referenceWidth = round(reference.width);\n  var popperWidth = round(popper.width);\n\n  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  var isVariation = data.placement.indexOf('-') !== -1;\n  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n  var verticalToInteger = !shouldRound ? noRound : round;\n\n  return {\n    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right)\n  };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n  var x = options.x,\n      y = options.y;\n  var popper = data.offsets.popper;\n\n  // Remove this legacy support in Popper.js v2\n\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'applyStyle';\n  }).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n  }\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n  var offsetParent = getOffsetParent(data.instance.popper);\n  var offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  var styles = {\n    position: popper.position\n  };\n\n  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\n  var sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  var prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  var left = void 0,\n      top = void 0;\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    var invertTop = sideA === 'bottom' ? -1 : 1;\n    var invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = sideA + ', ' + sideB;\n  }\n\n  // Attributes\n  var attributes = {\n    'x-placement': data.placement\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = _extends({}, attributes, data.attributes);\n  data.styles = _extends({}, styles, data.styles);\n  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n  return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n  var requesting = find(modifiers, function (_ref) {\n    var name = _ref.name;\n    return name === requestingName;\n  });\n\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n  });\n\n  if (!isRequired) {\n    var _requesting = '`' + requestingName + '`';\n    var requested = '`' + requestedName + '`';\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n  }\n  return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n  var _data$offsets$arrow;\n\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  var arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\n      return data;\n    }\n  }\n\n  var placement = data.placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  var len = isVertical ? 'height' : 'width';\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\n  var side = sideCapitalized.toLowerCase();\n  var altSide = isVertical ? 'left' : 'top';\n  var opSide = isVertical ? 'bottom' : 'right';\n  var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  var css = getStyleComputedProperty(data.instance.popper);\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n  return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var index = validPlacements.indexOf(placement);\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n  var placement = data.placement.split('-')[0];\n  var placementOpposite = getOppositePlacement(placement);\n  var variation = data.placement.split('-')[1] || '';\n\n  var flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach(function (step, index) {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    var popperOffsets = data.offsets.popper;\n    var refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    var floor = Math.floor;\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n    // flip the variation if required\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n    // flips variation if reference element overflows boundaries\n    var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n    // flips variation if popper content overflows boundaries\n    var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n    var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var placement = data.placement.split('-')[0];\n  var floor = Math.floor;\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  var side = isVertical ? 'right' : 'bottom';\n  var opSide = isVertical ? 'left' : 'top';\n  var measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  var value = +split[1];\n  var unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    var element = void 0;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    var rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    var size = void 0;\n    if (unit === 'vh') {\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n    } else {\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n  var offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n    return frag.trim();\n  });\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  var divider = fragments.indexOf(find(fragments, function (frag) {\n    return frag.search(/,|\\s/) !== -1;\n  }));\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  var splitRegex = /\\s*,\\s*|\\s+/;\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map(function (op, index) {\n    // Most of the units rely on the orientation of the popper\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n    var mergeWithPrevious = false;\n    return op\n    // This aggregates any `+` or `-` sign that aren't considered operators\n    // e.g.: 10 + +5 => [10, +, +5]\n    .reduce(function (a, b) {\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n        a[a.length - 1] = b;\n        mergeWithPrevious = true;\n        return a;\n      } else if (mergeWithPrevious) {\n        a[a.length - 1] += b;\n        mergeWithPrevious = false;\n        return a;\n      } else {\n        return a.concat(b);\n      }\n    }, [])\n    // Here we convert the string values into number values (in px)\n    .map(function (str) {\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\n    });\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach(function (op, index) {\n    op.forEach(function (frag, index2) {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n  var offset = _ref.offset;\n  var placement = data.placement,\n      _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var basePlacement = placement.split('-')[0];\n\n  var offsets = void 0;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n  var transformProp = getSupportedPropertyName('transform');\n  var popperStyles = data.instance.popper.style; // assignment to help minification\n  var top = popperStyles.top,\n      left = popperStyles.left,\n      transform = popperStyles[transformProp];\n\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n  // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n\n  options.boundaries = boundaries;\n\n  var order = options.priority;\n  var popper = data.offsets.popper;\n\n  var check = {\n    primary: function primary(placement) {\n      var value = popper[placement];\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return defineProperty({}, placement, value);\n    },\n    secondary: function secondary(placement) {\n      var mainSide = placement === 'right' ? 'left' : 'top';\n      var value = popper[mainSide];\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n      }\n      return defineProperty({}, mainSide, value);\n    }\n  };\n\n  order.forEach(function (placement) {\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = _extends({}, popper, check[side](placement));\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    var _data$offsets = data.offsets,\n        reference = _data$offsets.reference,\n        popper = _data$offsets.popper;\n\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    var side = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    var shiftOffsets = {\n      start: defineProperty({}, side, reference[side]),\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n    };\n\n    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  var refRect = data.offsets.reference;\n  var bound = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'preventOverflow';\n  }).boundaries;\n\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent'\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]'\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right'\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined\n  }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: function onCreate() {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: function onUpdate() {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  function Popper(reference, popper) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    classCallCheck(this, Popper);\n\n    this.scheduleUpdate = function () {\n      return requestAnimationFrame(_this.update);\n    };\n\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = _extends({}, Popper.Defaults, options);\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: []\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n      return _extends({\n        name: name\n      }, _this.options.modifiers[name]);\n    })\n    // sort the modifiers by order\n    .sort(function (a, b) {\n      return a.order - b.order;\n    });\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(function (modifierOptions) {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    var eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n\n\n  createClass(Popper, [{\n    key: 'update',\n    value: function update$$1() {\n      return update.call(this);\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy$$1() {\n      return destroy.call(this);\n    }\n  }, {\n    key: 'enableEventListeners',\n    value: function enableEventListeners$$1() {\n      return enableEventListeners.call(this);\n    }\n  }, {\n    key: 'disableEventListeners',\n    value: function disableEventListeners$$1() {\n      return disableEventListeners.call(this);\n    }\n\n    /**\n     * Schedules an update. It will run on the next UI update available.\n     * @method scheduleUpdate\n     * @memberof Popper\n     */\n\n    /**\n     * Collection of utilities useful when writing custom modifiers.\n     * Starting from version 1.7, this method is available only if you\n     * include `popper-utils.js` before `popper.js`.\n     *\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\n     * and will be removed in v2! Use the PopperUtils module directly instead.\n     * Due to the high instability of the methods contained in Utils, we can't\n     * guarantee them to follow semver. Use them at your own risk!\n     * @static\n     * @private\n     * @type {Object}\n     * @deprecated since version 1.8\n     * @member Utils\n     * @memberof Popper\n     */\n\n  }]);\n  return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexports.default = Popper;\n//# sourceMappingURL=popper.js.map\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz9mMGJkIl0sIm5hbWVzIjpbImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwidGltZW91dER1cmF0aW9uIiwibG9uZ2VyVGltZW91dEJyb3dzZXJzIiwiaSIsImxlbmd0aCIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJtaWNyb3Rhc2tEZWJvdW5jZSIsImZuIiwiY2FsbGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwidGFza0RlYm91bmNlIiwic2NoZWR1bGVkIiwic2V0VGltZW91dCIsInN1cHBvcnRzTWljcm9UYXNrcyIsImRlYm91bmNlIiwiaXNGdW5jdGlvbiIsImZ1bmN0aW9uVG9DaGVjayIsImdldFR5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkiLCJlbGVtZW50IiwicHJvcGVydHkiLCJub2RlVHlwZSIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsImNzcyIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQYXJlbnROb2RlIiwibm9kZU5hbWUiLCJwYXJlbnROb2RlIiwiaG9zdCIsImdldFNjcm9sbFBhcmVudCIsImJvZHkiLCJfZ2V0U3R5bGVDb21wdXRlZFByb3AiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsInRlc3QiLCJnZXRSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlTm9kZSIsImlzSUUxMSIsIk1TSW5wdXRNZXRob2RDb250ZXh0IiwiZG9jdW1lbnRNb2RlIiwiaXNJRTEwIiwiaXNJRSIsInZlcnNpb24iLCJnZXRPZmZzZXRQYXJlbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJub09mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsIm5leHRFbGVtZW50U2libGluZyIsImlzT2Zmc2V0Q29udGFpbmVyIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRSb290Iiwibm9kZSIsImZpbmRDb21tb25PZmZzZXRQYXJlbnQiLCJlbGVtZW50MSIsImVsZW1lbnQyIiwib3JkZXIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzdGFydCIsImVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRTdGFydCIsInNldEVuZCIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiY29udGFpbnMiLCJlbGVtZW50MXJvb3QiLCJnZXRTY3JvbGwiLCJzaWRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwidXBwZXJTaWRlIiwiaHRtbCIsInNjcm9sbGluZ0VsZW1lbnQiLCJpbmNsdWRlU2Nyb2xsIiwicmVjdCIsInN1YnRyYWN0Iiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsIm1vZGlmaWVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiZ2V0Qm9yZGVyc1NpemUiLCJzdHlsZXMiLCJheGlzIiwic2lkZUEiLCJzaWRlQiIsInBhcnNlRmxvYXQiLCJnZXRTaXplIiwiY29tcHV0ZWRTdHlsZSIsIk1hdGgiLCJtYXgiLCJwYXJzZUludCIsImdldFdpbmRvd1NpemVzIiwiaGVpZ2h0Iiwid2lkdGgiLCJjbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJjcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsInByb3RvdHlwZSIsIm9iaiIsInZhbHVlIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImdldENsaWVudFJlY3QiLCJvZmZzZXRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZSIsInJlc3VsdCIsInNpemVzIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJob3JpelNjcm9sbGJhciIsIm9mZnNldFdpZHRoIiwidmVydFNjcm9sbGJhciIsIm9mZnNldEhlaWdodCIsImdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZSIsImNoaWxkcmVuIiwicGFyZW50IiwiZml4ZWRQb3NpdGlvbiIsImlzSFRNTCIsImNoaWxkcmVuUmVjdCIsInBhcmVudFJlY3QiLCJzY3JvbGxQYXJlbnQiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckxlZnRXaWR0aCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUiLCJleGNsdWRlU2Nyb2xsIiwicmVsYXRpdmVPZmZzZXQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJvZmZzZXQiLCJpc0ZpeGVkIiwiZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCIsInBhcmVudEVsZW1lbnQiLCJlbCIsImdldEJvdW5kYXJpZXMiLCJwb3BwZXIiLCJwYWRkaW5nIiwiYm91bmRhcmllc0VsZW1lbnQiLCJib3VuZGFyaWVzIiwiYm91bmRhcmllc05vZGUiLCJfZ2V0V2luZG93U2l6ZXMiLCJpc1BhZGRpbmdOdW1iZXIiLCJnZXRBcmVhIiwiX3JlZiIsImNvbXB1dGVBdXRvUGxhY2VtZW50IiwicGxhY2VtZW50IiwicmVmUmVjdCIsInJlY3RzIiwic29ydGVkQXJlYXMiLCJrZXlzIiwibWFwIiwiYXJlYSIsInNvcnQiLCJhIiwiYiIsImZpbHRlcmVkQXJlYXMiLCJmaWx0ZXIiLCJfcmVmMiIsImNvbXB1dGVkUGxhY2VtZW50IiwidmFyaWF0aW9uIiwic3BsaXQiLCJnZXRSZWZlcmVuY2VPZmZzZXRzIiwic3RhdGUiLCJjb21tb25PZmZzZXRQYXJlbnQiLCJnZXRPdXRlclNpemVzIiwieCIsIm1hcmdpbkJvdHRvbSIsInkiLCJtYXJnaW5SaWdodCIsImdldE9wcG9zaXRlUGxhY2VtZW50IiwiaGFzaCIsInJlcGxhY2UiLCJtYXRjaGVkIiwiZ2V0UG9wcGVyT2Zmc2V0cyIsInJlZmVyZW5jZU9mZnNldHMiLCJwb3BwZXJSZWN0IiwicG9wcGVyT2Zmc2V0cyIsImlzSG9yaXoiLCJtYWluU2lkZSIsInNlY29uZGFyeVNpZGUiLCJtZWFzdXJlbWVudCIsInNlY29uZGFyeU1lYXN1cmVtZW50IiwiZmluZCIsImFyciIsImNoZWNrIiwiQXJyYXkiLCJmaW5kSW5kZXgiLCJwcm9wIiwiY3VyIiwibWF0Y2giLCJydW5Nb2RpZmllcnMiLCJtb2RpZmllcnMiLCJkYXRhIiwiZW5kcyIsIm1vZGlmaWVyc1RvUnVuIiwic2xpY2UiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJlbmFibGVkIiwidXBkYXRlIiwiaXNEZXN0cm95ZWQiLCJhcnJvd1N0eWxlcyIsImF0dHJpYnV0ZXMiLCJmbGlwcGVkIiwib3B0aW9ucyIsInBvc2l0aW9uRml4ZWQiLCJmbGlwIiwib3JpZ2luYWxQbGFjZW1lbnQiLCJwb3NpdGlvbiIsImlzQ3JlYXRlZCIsIm9uQ3JlYXRlIiwib25VcGRhdGUiLCJpc01vZGlmaWVyRW5hYmxlZCIsIm1vZGlmaWVyTmFtZSIsInNvbWUiLCJuYW1lIiwiZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lIiwicHJlZml4ZXMiLCJ1cHBlclByb3AiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInByZWZpeCIsInRvQ2hlY2siLCJzdHlsZSIsImRlc3Ryb3kiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ3aWxsQ2hhbmdlIiwiZGlzYWJsZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlT25EZXN0cm95IiwicmVtb3ZlQ2hpbGQiLCJnZXRXaW5kb3ciLCJhdHRhY2hUb1Njcm9sbFBhcmVudHMiLCJldmVudCIsImNhbGxiYWNrIiwic2Nyb2xsUGFyZW50cyIsImlzQm9keSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicHVzaCIsInNldHVwRXZlbnRMaXN0ZW5lcnMiLCJ1cGRhdGVCb3VuZCIsInNjcm9sbEVsZW1lbnQiLCJldmVudHNFbmFibGVkIiwiZW5hYmxlRXZlbnRMaXN0ZW5lcnMiLCJzY2hlZHVsZVVwZGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiaXNOdW1lcmljIiwibiIsImlzTmFOIiwiaXNGaW5pdGUiLCJzZXRTdHlsZXMiLCJ1bml0Iiwic2V0QXR0cmlidXRlcyIsInNldEF0dHJpYnV0ZSIsImFwcGx5U3R5bGUiLCJhcnJvd0VsZW1lbnQiLCJhcHBseVN0eWxlT25Mb2FkIiwibW9kaWZpZXJPcHRpb25zIiwiZ2V0Um91bmRlZE9mZnNldHMiLCJzaG91bGRSb3VuZCIsIl9kYXRhJG9mZnNldHMiLCJyb3VuZCIsImZsb29yIiwibm9Sb3VuZCIsInYiLCJyZWZlcmVuY2VXaWR0aCIsInBvcHBlcldpZHRoIiwiaXNWZXJ0aWNhbCIsImlzVmFyaWF0aW9uIiwic2FtZVdpZHRoUGFyaXR5IiwiYm90aE9kZFdpZHRoIiwiaG9yaXpvbnRhbFRvSW50ZWdlciIsInZlcnRpY2FsVG9JbnRlZ2VyIiwiaXNGaXJlZm94IiwiY29tcHV0ZVN0eWxlIiwibGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uIiwiZ3B1QWNjZWxlcmF0aW9uIiwib2Zmc2V0UGFyZW50UmVjdCIsImRldmljZVBpeGVsUmF0aW8iLCJwcmVmaXhlZFByb3BlcnR5IiwiaW52ZXJ0VG9wIiwiaW52ZXJ0TGVmdCIsImFycm93IiwiaXNNb2RpZmllclJlcXVpcmVkIiwicmVxdWVzdGluZ05hbWUiLCJyZXF1ZXN0ZWROYW1lIiwicmVxdWVzdGluZyIsImlzUmVxdWlyZWQiLCJfcmVxdWVzdGluZyIsInJlcXVlc3RlZCIsIl9kYXRhJG9mZnNldHMkYXJyb3ciLCJxdWVyeVNlbGVjdG9yIiwibGVuIiwic2lkZUNhcGl0YWxpemVkIiwidG9Mb3dlckNhc2UiLCJhbHRTaWRlIiwib3BTaWRlIiwiYXJyb3dFbGVtZW50U2l6ZSIsImNlbnRlciIsInBvcHBlck1hcmdpblNpZGUiLCJwb3BwZXJCb3JkZXJTaWRlIiwic2lkZVZhbHVlIiwibWluIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb24iLCJwbGFjZW1lbnRzIiwidmFsaWRQbGFjZW1lbnRzIiwiY2xvY2t3aXNlIiwiY291bnRlciIsImluZGV4IiwiY29uY2F0IiwicmV2ZXJzZSIsIkJFSEFWSU9SUyIsIkZMSVAiLCJDTE9DS1dJU0UiLCJDT1VOVEVSQ0xPQ0tXSVNFIiwicGxhY2VtZW50T3Bwb3NpdGUiLCJmbGlwT3JkZXIiLCJiZWhhdmlvciIsInN0ZXAiLCJyZWZPZmZzZXRzIiwib3ZlcmxhcHNSZWYiLCJvdmVyZmxvd3NMZWZ0Iiwib3ZlcmZsb3dzUmlnaHQiLCJvdmVyZmxvd3NUb3AiLCJvdmVyZmxvd3NCb3R0b20iLCJvdmVyZmxvd3NCb3VuZGFyaWVzIiwiZmxpcHBlZFZhcmlhdGlvbkJ5UmVmIiwiZmxpcFZhcmlhdGlvbnMiLCJmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50IiwiZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQiLCJmbGlwcGVkVmFyaWF0aW9uIiwia2VlcFRvZ2V0aGVyIiwidG9WYWx1ZSIsInN0ciIsInNpemUiLCJwYXJzZU9mZnNldCIsImJhc2VQbGFjZW1lbnQiLCJ1c2VIZWlnaHQiLCJmcmFnbWVudHMiLCJmcmFnIiwidHJpbSIsImRpdmlkZXIiLCJzZWFyY2giLCJzcGxpdFJlZ2V4Iiwib3BzIiwib3AiLCJtZXJnZVdpdGhQcmV2aW91cyIsInJlZHVjZSIsImluZGV4MiIsInByZXZlbnRPdmVyZmxvdyIsInRyYW5zZm9ybVByb3AiLCJwb3BwZXJTdHlsZXMiLCJ0cmFuc2Zvcm0iLCJwcmlvcml0eSIsInByaW1hcnkiLCJlc2NhcGVXaXRoUmVmZXJlbmNlIiwic2Vjb25kYXJ5Iiwic2hpZnQiLCJzaGlmdHZhcmlhdGlvbiIsInNoaWZ0T2Zmc2V0cyIsImhpZGUiLCJib3VuZCIsImlubmVyIiwic3VidHJhY3RMZW5ndGgiLCJvbkxvYWQiLCJEZWZhdWx0cyIsIlBvcHBlciIsIl90aGlzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYmluZCIsImpxdWVyeSIsInVwZGF0ZSQkMSIsImRlc3Ryb3kkJDEiLCJlbmFibGVFdmVudExpc3RlbmVycyQkMSIsImRpc2FibGVFdmVudExpc3RlbmVycyQkMSIsIlV0aWxzIiwiZ2xvYmFsIiwiUG9wcGVyVXRpbHMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxJQUFJQSxZQUFZLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUMsT0FBT0MsUUFBUCxLQUFvQixXQUFyRCxJQUFvRSxPQUFPQyxTQUFQLEtBQXFCLFdBQXpHOztBQUVBLElBQUlDLGtCQUFrQixZQUFZO0FBQ2hDLE1BQUlDLHdCQUF3QixDQUFDLE1BQUQsRUFBUyxTQUFULEVBQW9CLFNBQXBCLENBQTVCO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELHNCQUFzQkUsTUFBMUMsRUFBa0RELEtBQUssQ0FBdkQsRUFBMEQ7QUFDeEQsUUFBSU4sYUFBYUcsVUFBVUssU0FBVixDQUFvQkMsT0FBcEIsQ0FBNEJKLHNCQUFzQkMsQ0FBdEIsQ0FBNUIsS0FBeUQsQ0FBMUUsRUFBNkU7QUFDM0UsYUFBTyxDQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU8sQ0FBUDtBQUNELENBUnFCLEVBQXRCOztBQVVBLFNBQVNJLGlCQUFULENBQTJCQyxFQUEzQixFQUErQjtBQUM3QixNQUFJQyxTQUFTLEtBQWI7QUFDQSxTQUFPLFlBQVk7QUFDakIsUUFBSUEsTUFBSixFQUFZO0FBQ1Y7QUFDRDtBQUNEQSxhQUFTLElBQVQ7QUFDQVgsV0FBT1ksT0FBUCxDQUFlQyxPQUFmLEdBQXlCQyxJQUF6QixDQUE4QixZQUFZO0FBQ3hDSCxlQUFTLEtBQVQ7QUFDQUQ7QUFDRCxLQUhEO0FBSUQsR0FURDtBQVVEOztBQUVELFNBQVNLLFlBQVQsQ0FBc0JMLEVBQXRCLEVBQTBCO0FBQ3hCLE1BQUlNLFlBQVks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bS9wb3BwZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiohXG4gKiBAZmlsZU92ZXJ2aWV3IEtpY2thc3MgbGlicmFyeSB0byBjcmVhdGUgYW5kIHBsYWNlIHBvcHBlcnMgbmVhciB0aGVpciByZWZlcmVuY2UgZWxlbWVudHMuXG4gKiBAdmVyc2lvbiAxLjE2LjFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmVkZXJpY28gWml2b2xvIGFuZCBjb250cmlidXRvcnNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJztcblxudmFyIHRpbWVvdXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxvbmdlclRpbWVvdXRCcm93c2VycyA9IFsnRWRnZScsICdUcmlkZW50JywgJ0ZpcmVmb3gnXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nZXJUaW1lb3V0QnJvd3NlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn0oKTtcblxuZnVuY3Rpb24gbWljcm90YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGZuKCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRhc2tEZWJvdW5jZShmbikge1xuICB2YXIgc2NoZWR1bGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzY2hlZHVsZWQpIHtcbiAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIGZuKCk7XG4gICAgICB9LCB0aW1lb3V0RHVyYXRpb24pO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHN1cHBvcnRzTWljcm9UYXNrcyA9IGlzQnJvd3NlciAmJiB3aW5kb3cuUHJvbWlzZTtcblxuLyoqXG4qIENyZWF0ZSBhIGRlYm91bmNlZCB2ZXJzaW9uIG9mIGEgbWV0aG9kLCB0aGF0J3MgYXN5bmNocm9ub3VzbHkgZGVmZXJyZWRcbiogYnV0IGNhbGxlZCBpbiB0aGUgbWluaW11bSB0aW1lIHBvc3NpYmxlLlxuKlxuKiBAbWV0aG9kXG4qIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiogQGFyZ3VtZW50IHtGdW5jdGlvbn0gZm5cbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbnZhciBkZWJvdW5jZSA9IHN1cHBvcnRzTWljcm9UYXNrcyA/IG1pY3JvdGFza0RlYm91bmNlIDogdGFza0RlYm91bmNlO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FueX0gZnVuY3Rpb25Ub0NoZWNrIC0gdmFyaWFibGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG86IGlzIGEgZnVuY3Rpb24/XG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuY3Rpb25Ub0NoZWNrKSB7XG4gIHZhciBnZXRUeXBlID0ge307XG4gIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogR2V0IENTUyBjb21wdXRlZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSBvYmplY3QsIG9yIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGl0c2VsZi5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSB7XG4gIHJldHVybiByZWZlcmVuY2UgJiYgcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgPyByZWZlcmVuY2UucmVmZXJlbmNlTm9kZSA6IHJlZmVyZW5jZTtcbn1cblxudmFyIGlzSUUxMSA9IGlzQnJvd3NlciAmJiAhISh3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcbnZhciBpc0lFMTAgPSBpc0Jyb3dzZXIgJiYgL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBpc0lFXG4gKi9cbmZ1bmN0aW9uIGlzSUUodmVyc2lvbikge1xuICBpZiAodmVyc2lvbiA9PT0gMTEpIHtcbiAgICByZXR1cm4gaXNJRTExO1xuICB9XG4gIGlmICh2ZXJzaW9uID09PSAxMCkge1xuICAgIHJldHVybiBpc0lFMTA7XG4gIH1cbiAgcmV0dXJuIGlzSUUxMSB8fCBpc0lFMTA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2Zmc2V0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgdmFyIG5vT2Zmc2V0UGFyZW50ID0gaXNJRSgxMCkgPyBkb2N1bWVudC5ib2R5IDogbnVsbDtcblxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgfHwgbnVsbDtcbiAgLy8gU2tpcCBoaWRkZW4gZWxlbWVudHMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBvZmZzZXRQYXJlbnRcbiAgd2hpbGUgKG9mZnNldFBhcmVudCA9PT0gbm9PZmZzZXRQYXJlbnQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSAoZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKS5vZmZzZXRQYXJlbnQ7XG4gIH1cblxuICB2YXIgbm9kZU5hbWUgPSBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50Lm5vZGVOYW1lO1xuXG4gIGlmICghbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gLm9mZnNldFBhcmVudCB3aWxsIHJldHVybiB0aGUgY2xvc2VzdCBUSCwgVEQgb3IgVEFCTEUgaW4gY2FzZVxuICAvLyBubyBvZmZzZXRQYXJlbnQgaXMgcHJlc2VudCwgSSBoYXRlIHRoaXMgam9iLi4uXG4gIGlmIChbJ1RIJywgJ1REJywgJ1RBQkxFJ10uaW5kZXhPZihvZmZzZXRQYXJlbnQubm9kZU5hbWUpICE9PSAtMSAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50O1xufVxuXG5mdW5jdGlvbiBpc09mZnNldENvbnRhaW5lcihlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnSFRNTCcgfHwgZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpID09PSBlbGVtZW50O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSByb290IG5vZGUgKGRvY3VtZW50LCBzaGFkb3dET00gcm9vdCkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge0VsZW1lbnR9IHJvb3Qgbm9kZVxuICovXG5mdW5jdGlvbiBnZXRSb290KG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBnZXRSb290KG5vZGUucGFyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb2Zmc2V0IHBhcmVudCBjb21tb24gdG8gdGhlIHR3byBwcm92aWRlZCBub2Rlc1xuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MVxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MlxuICogQHJldHVybnMge0VsZW1lbnR9IGNvbW1vbiBvZmZzZXQgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQxIHx8ICFlbGVtZW50MS5ub2RlVHlwZSB8fCAhZWxlbWVudDIgfHwgIWVsZW1lbnQyLm5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIEhlcmUgd2UgbWFrZSBzdXJlIHRvIGdpdmUgYXMgXCJzdGFydFwiIHRoZSBlbGVtZW50IHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTVxuICB2YXIgb3JkZXIgPSBlbGVtZW50MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50MikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORztcbiAgdmFyIHN0YXJ0ID0gb3JkZXIgPyBlbGVtZW50MSA6IGVsZW1lbnQyO1xuICB2YXIgZW5kID0gb3JkZXIgPyBlbGVtZW50MiA6IGVsZW1lbnQxO1xuXG4gIC8vIEdldCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldFN0YXJ0KHN0YXJ0LCAwKTtcbiAgcmFuZ2Uuc2V0RW5kKGVuZCwgMCk7XG4gIHZhciBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gIC8vIEJvdGggbm9kZXMgYXJlIGluc2lkZSAjZG9jdW1lbnRcblxuICBpZiAoZWxlbWVudDEgIT09IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyICYmIGVsZW1lbnQyICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciB8fCBzdGFydC5jb250YWlucyhlbmQpKSB7XG4gICAgaWYgKGlzT2Zmc2V0Q29udGFpbmVyKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkge1xuICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQoY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICB9XG5cbiAgLy8gb25lIG9mIHRoZSBub2RlcyBpcyBpbnNpZGUgc2hhZG93RE9NLCBmaW5kIHdoaWNoIG9uZVxuICB2YXIgZWxlbWVudDFyb290ID0gZ2V0Um9vdChlbGVtZW50MSk7XG4gIGlmIChlbGVtZW50MXJvb3QuaG9zdCkge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxcm9vdC5ob3N0LCBlbGVtZW50Mik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGdldFJvb3QoZWxlbWVudDIpLmhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiBzaWRlICh0b3AgYW5kIGxlZnQpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzaWRlIGB0b3BgIG9yIGBsZWZ0YFxuICogQHJldHVybnMge251bWJlcn0gYW1vdW50IG9mIHNjcm9sbGVkIHBpeGVsc1xuICovXG5mdW5jdGlvbiBnZXRTY3JvbGwoZWxlbWVudCkge1xuICB2YXIgc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3RvcCc7XG5cbiAgdmFyIHVwcGVyU2lkZSA9IHNpZGUgPT09ICd0b3AnID8gJ3Njcm9sbFRvcCcgOiAnc2Nyb2xsTGVmdCc7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGh0bWw7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnRbdXBwZXJTaWRlXTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50W3VwcGVyU2lkZV07XG59XG5cbi8qXG4gKiBTdW0gb3Igc3VidHJhY3QgdGhlIGVsZW1lbnQgc2Nyb2xsIHZhbHVlcyAobGVmdCBhbmQgdG9wKSBmcm9tIGEgZ2l2ZW4gcmVjdCBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0IC0gUmVjdCBvYmplY3QgeW91IHdhbnQgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB0aGUgZnVuY3Rpb24gcmVhZHMgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VidHJhY3QgLSBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdWJ0cmFjdCB0aGUgc2Nyb2xsIHZhbHVlc1xuICogQHJldHVybiB7T2JqZWN0fSByZWN0IC0gVGhlIG1vZGlmaWVyIHJlY3Qgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVTY3JvbGwocmVjdCwgZWxlbWVudCkge1xuICB2YXIgc3VidHJhY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICB2YXIgbW9kaWZpZXIgPSBzdWJ0cmFjdCA/IC0xIDogMTtcbiAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wICogbW9kaWZpZXI7XG4gIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdCAqIG1vZGlmaWVyO1xuICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbi8qXG4gKiBIZWxwZXIgdG8gZGV0ZWN0IGJvcmRlcnMgb2YgYSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xuICogUmVzdWx0IG9mIGBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHlgIG9uIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpcyAtIGB4YCBvciBgeWBcbiAqIEByZXR1cm4ge251bWJlcn0gYm9yZGVycyAtIFRoZSBib3JkZXJzIHNpemUgb2YgdGhlIGdpdmVuIGF4aXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsIGF4aXMpIHtcbiAgdmFyIHNpZGVBID0gYXhpcyA9PT0gJ3gnID8gJ0xlZnQnIDogJ1RvcCc7XG4gIHZhciBzaWRlQiA9IHNpZGVBID09PSAnTGVmdCcgPyAnUmlnaHQnIDogJ0JvdHRvbSc7XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUEgKyAnV2lkdGgnXSkgKyBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVCICsgJ1dpZHRoJ10pO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IHBhcnNlSW50KGh0bWxbJ29mZnNldCcgKyBheGlzXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ1RvcCcgOiAnTGVmdCcpXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ0JvdHRvbScgOiAnUmlnaHQnKV0pIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKGRvY3VtZW50KSB7XG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBjb21wdXRlZFN0eWxlID0gaXNJRSgxMCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZ2V0U2l6ZSgnSGVpZ2h0JywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSksXG4gICAgd2lkdGg6IGdldFNpemUoJ1dpZHRoJywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSlcbiAgfTtcbn1cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuXG5cblxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKipcbiAqIEdpdmVuIGVsZW1lbnQgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gb2Zmc2V0c1xuICogQHJldHVybnMge09iamVjdH0gQ2xpZW50UmVjdCBsaWtlIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0KG9mZnNldHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvZmZzZXRzLCB7XG4gICAgcmlnaHQ6IG9mZnNldHMubGVmdCArIG9mZnNldHMud2lkdGgsXG4gICAgYm90dG9tOiBvZmZzZXRzLnRvcCArIG9mZnNldHMuaGVpZ2h0XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBib3VuZGluZyBjbGllbnQgcmVjdCBvZiBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IGNsaWVudCByZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0ge307XG5cbiAgLy8gSUUxMCAxMCBGSVg6IFBsZWFzZSwgZG9uJ3QgYXNrLCB0aGUgZWxlbWVudCBpc24ndFxuICAvLyBjb25zaWRlcmVkIGluIERPTSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuLi5cbiAgLy8gVGhpcyBpc24ndCByZXByb2R1Y2libGUgaW4gSUUxMCBjb21wYXRpYmlsaXR5IG1vZGUgb2YgSUUxMVxuICB0cnkge1xuICAgIGlmIChpc0lFKDEwKSkge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gICAgICByZWN0LnRvcCArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdDtcbiAgICAgIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QucmlnaHQgKz0gc2Nyb2xsTGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3AsXG4gICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gIH07XG5cbiAgLy8gc3VidHJhY3Qgc2Nyb2xsYmFyIHNpemUgZnJvbSBzaXplc1xuICB2YXIgc2l6ZXMgPSBlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcgPyBnZXRXaW5kb3dTaXplcyhlbGVtZW50Lm93bmVyRG9jdW1lbnQpIDoge307XG4gIHZhciB3aWR0aCA9IHNpemVzLndpZHRoIHx8IGVsZW1lbnQuY2xpZW50V2lkdGggfHwgcmVzdWx0LndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5oZWlnaHQ7XG5cbiAgdmFyIGhvcml6U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIHdpZHRoO1xuICB2YXIgdmVydFNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVpZ2h0O1xuXG4gIC8vIGlmIGFuIGh5cG90aGV0aWNhbCBzY3JvbGxiYXIgaXMgZGV0ZWN0ZWQsIHdlIG11c3QgYmUgc3VyZSBpdCdzIG5vdCBhIGBib3JkZXJgXG4gIC8vIHdlIG1ha2UgdGhpcyBjaGVjayBjb25kaXRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICBpZiAoaG9yaXpTY3JvbGxiYXIgfHwgdmVydFNjcm9sbGJhcikge1xuICAgIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCk7XG4gICAgaG9yaXpTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneCcpO1xuICAgIHZlcnRTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneScpO1xuXG4gICAgcmVzdWx0LndpZHRoIC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIHJlc3VsdC5oZWlnaHQgLT0gdmVydFNjcm9sbGJhcjtcbiAgfVxuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShjaGlsZHJlbiwgcGFyZW50KSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaXNJRTEwID0gaXNJRSgxMCk7XG4gIHZhciBpc0hUTUwgPSBwYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJztcbiAgdmFyIGNoaWxkcmVuUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChjaGlsZHJlbik7XG4gIHZhciBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoY2hpbGRyZW4pO1xuXG4gIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50KTtcbiAgdmFyIGJvcmRlclRvcFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyVG9wV2lkdGgpO1xuICB2YXIgYm9yZGVyTGVmdFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyTGVmdFdpZHRoKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgaXNIVE1MKSB7XG4gICAgcGFyZW50UmVjdC50b3AgPSBNYXRoLm1heChwYXJlbnRSZWN0LnRvcCwgMCk7XG4gICAgcGFyZW50UmVjdC5sZWZ0ID0gTWF0aC5tYXgocGFyZW50UmVjdC5sZWZ0LCAwKTtcbiAgfVxuICB2YXIgb2Zmc2V0cyA9IGdldENsaWVudFJlY3Qoe1xuICAgIHRvcDogY2hpbGRyZW5SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wIC0gYm9yZGVyVG9wV2lkdGgsXG4gICAgbGVmdDogY2hpbGRyZW5SZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgLSBib3JkZXJMZWZ0V2lkdGgsXG4gICAgd2lkdGg6IGNoaWxkcmVuUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IGNoaWxkcmVuUmVjdC5oZWlnaHRcbiAgfSk7XG4gIG9mZnNldHMubWFyZ2luVG9wID0gMDtcbiAgb2Zmc2V0cy5tYXJnaW5MZWZ0ID0gMDtcblxuICAvLyBTdWJ0cmFjdCBtYXJnaW5zIG9mIGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGl0J3MgYmVpbmcgdXNlZCBhcyBwYXJlbnRcbiAgLy8gd2UgZG8gdGhpcyBvbmx5IG9uIEhUTUwgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IGVsZW1lbnQgdGhhdCBiZWhhdmVzXG4gIC8vIGRpZmZlcmVudGx5IHdoZW4gbWFyZ2lucyBhcmUgYXBwbGllZCB0byBpdC4gVGhlIG1hcmdpbnMgYXJlIGluY2x1ZGVkIGluXG4gIC8vIHRoZSBib3ggb2YgdGhlIGRvY3VtZW50RWxlbWVudCwgaW4gdGhlIG90aGVyIGNhc2VzIG5vdC5cbiAgaWYgKCFpc0lFMTAgJiYgaXNIVE1MKSB7XG4gICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcblxuICAgIG9mZnNldHMudG9wIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMuYm90dG9tIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubGVmdCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuICAgIG9mZnNldHMucmlnaHQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcblxuICAgIC8vIEF0dGFjaCBtYXJnaW5Ub3AgYW5kIG1hcmdpbkxlZnQgYmVjYXVzZSBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgbWF5IG5lZWQgdGhlbVxuICAgIG9mZnNldHMubWFyZ2luVG9wID0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XG4gIH1cblxuICBpZiAoaXNJRTEwICYmICFmaXhlZFBvc2l0aW9uID8gcGFyZW50LmNvbnRhaW5zKHNjcm9sbFBhcmVudCkgOiBwYXJlbnQgPT09IHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQubm9kZU5hbWUgIT09ICdCT0RZJykge1xuICAgIG9mZnNldHMgPSBpbmNsdWRlU2Nyb2xsKG9mZnNldHMsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlKGVsZW1lbnQpIHtcbiAgdmFyIGV4Y2x1ZGVTY3JvbGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGVsZW1lbnQsIGh0bWwpO1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChodG1sLmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGh0bWwuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG5cbiAgdmFyIHNjcm9sbFRvcCA9ICFleGNsdWRlU2Nyb2xsID8gZ2V0U2Nyb2xsKGh0bWwpIDogMDtcbiAgdmFyIHNjcm9sbExlZnQgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sLCAnbGVmdCcpIDogMDtcblxuICB2YXIgb2Zmc2V0ID0ge1xuICAgIHRvcDogc2Nyb2xsVG9wIC0gcmVsYXRpdmVPZmZzZXQudG9wICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luVG9wLFxuICAgIGxlZnQ6IHNjcm9sbExlZnQgLSByZWxhdGl2ZU9mZnNldC5sZWZ0ICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luTGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChvZmZzZXQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGN1c3RvbUNvbnRhaW5lclxuICogQHJldHVybnMge0Jvb2xlYW59IGFuc3dlciB0byBcImlzRml4ZWQ/XCJcbiAqL1xuZnVuY3Rpb24gaXNGaXhlZChlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc0ZpeGVkKHBhcmVudE5vZGUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgYW4gZWxlbWVudCB0aGF0IGhhcyBhIHRyYW5zZm9ybWVkIHByb3BlcnR5IGRlZmluZWRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IGZpcnN0IHRyYW5zZm9ybWVkIHBhcmVudCBvciBkb2N1bWVudEVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgZXJyb3JzIGluIGNhc2Ugb25lIG9mIHRoZSBlbGVtZW50cyBpc24ndCBkZWZpbmVkIGZvciBhbnkgcmVhc29uXG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnRFbGVtZW50IHx8IGlzSUUoKSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIGVsID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoZWwgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsLCAndHJhbnNmb3JtJykgPT09ICdub25lJykge1xuICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIENvbXB1dGVkIHRoZSBib3VuZGFyaWVzIGxpbWl0cyBhbmQgcmV0dXJuIHRoZW1cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZ1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQgLSBFbGVtZW50IHVzZWQgdG8gZGVmaW5lIHRoZSBib3VuZGFyaWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGZpeGVkUG9zaXRpb24gLSBJcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBDb29yZGluYXRlcyBvZiB0aGUgYm91bmRhcmllc1xuICovXG5mdW5jdGlvbiBnZXRCb3VuZGFyaWVzKHBvcHBlciwgcmVmZXJlbmNlLCBwYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcblxuICB2YXIgYm91bmRhcmllcyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG5cbiAgLy8gSGFuZGxlIHZpZXdwb3J0IGNhc2VcbiAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgYm91bmRhcmllcyA9IGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIEhhbmRsZSBvdGhlciBjYXNlcyBiYXNlZCBvbiBET00gZWxlbWVudCB1c2VkIGFzIGJvdW5kYXJpZXNcbiAgICB2YXIgYm91bmRhcmllc05vZGUgPSB2b2lkIDA7XG4gICAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShyZWZlcmVuY2UpKTtcbiAgICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgIGJvdW5kYXJpZXNOb2RlID0gcG9wcGVyLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICd3aW5kb3cnKSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBib3VuZGFyaWVzRWxlbWVudDtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0cyA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShib3VuZGFyaWVzTm9kZSwgb2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcblxuICAgIC8vIEluIGNhc2Ugb2YgSFRNTCwgd2UgbmVlZCBhIGRpZmZlcmVudCBjb21wdXRhdGlvblxuICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnICYmICFpc0ZpeGVkKG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBfZ2V0V2luZG93U2l6ZXMgPSBnZXRXaW5kb3dTaXplcyhwb3BwZXIub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldFdpbmRvd1NpemVzLmhlaWdodCxcbiAgICAgICAgICB3aWR0aCA9IF9nZXRXaW5kb3dTaXplcy53aWR0aDtcblxuICAgICAgYm91bmRhcmllcy50b3AgKz0gb2Zmc2V0cy50b3AgLSBvZmZzZXRzLm1hcmdpblRvcDtcbiAgICAgIGJvdW5kYXJpZXMuYm90dG9tID0gaGVpZ2h0ICsgb2Zmc2V0cy50b3A7XG4gICAgICBib3VuZGFyaWVzLmxlZnQgKz0gb2Zmc2V0cy5sZWZ0IC0gb2Zmc2V0cy5tYXJnaW5MZWZ0O1xuICAgICAgYm91bmRhcmllcy5yaWdodCA9IHdpZHRoICsgb2Zmc2V0cy5sZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3IgYWxsIHRoZSBvdGhlciBET00gZWxlbWVudHMsIHRoaXMgb25lIGlzIGdvb2RcbiAgICAgIGJvdW5kYXJpZXMgPSBvZmZzZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBwYWRkaW5nc1xuICBwYWRkaW5nID0gcGFkZGluZyB8fCAwO1xuICB2YXIgaXNQYWRkaW5nTnVtYmVyID0gdHlwZW9mIHBhZGRpbmcgPT09ICdudW1iZXInO1xuICBib3VuZGFyaWVzLmxlZnQgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcubGVmdCB8fCAwO1xuICBib3VuZGFyaWVzLnRvcCArPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy50b3AgfHwgMDtcbiAgYm91bmRhcmllcy5yaWdodCAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5yaWdodCB8fCAwO1xuICBib3VuZGFyaWVzLmJvdHRvbSAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5ib3R0b20gfHwgMDtcblxuICByZXR1cm4gYm91bmRhcmllcztcbn1cblxuZnVuY3Rpb24gZ2V0QXJlYShfcmVmKSB7XG4gIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggKiBoZWlnaHQ7XG59XG5cbi8qKlxuICogVXRpbGl0eSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgYGF1dG9gIHBsYWNlbWVudCB0byB0aGUgcGxhY2VtZW50IHdpdGggbW9yZVxuICogYXZhaWxhYmxlIHNwYWNlLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQocGxhY2VtZW50LCByZWZSZWN0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDA7XG5cbiAgaWYgKHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gIHZhciByZWN0cyA9IHtcbiAgICB0b3A6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWZSZWN0LnRvcCAtIGJvdW5kYXJpZXMudG9wXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMucmlnaHQgLSByZWZSZWN0LnJpZ2h0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5ib3R0b20gLSByZWZSZWN0LmJvdHRvbVxuICAgIH0sXG4gICAgbGVmdDoge1xuICAgICAgd2lkdGg6IHJlZlJlY3QubGVmdCAtIGJvdW5kYXJpZXMubGVmdCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNvcnRlZEFyZWFzID0gT2JqZWN0LmtleXMocmVjdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgcmVjdHNba2V5XSwge1xuICAgICAgYXJlYTogZ2V0QXJlYShyZWN0c1trZXldKVxuICAgIH0pO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbiAgfSk7XG5cbiAgdmFyIGZpbHRlcmVkQXJlYXMgPSBzb3J0ZWRBcmVhcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICByZXR1cm4gd2lkdGggPj0gcG9wcGVyLmNsaWVudFdpZHRoICYmIGhlaWdodCA+PSBwb3BwZXIuY2xpZW50SGVpZ2h0O1xuICB9KTtcblxuICB2YXIgY29tcHV0ZWRQbGFjZW1lbnQgPSBmaWx0ZXJlZEFyZWFzLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEFyZWFzWzBdLmtleSA6IHNvcnRlZEFyZWFzWzBdLmtleTtcblxuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgcmV0dXJuIGNvbXB1dGVkUGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcbn1cblxuLyoqXG4gKiBHZXQgb2Zmc2V0cyB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtFbGVtZW50fSBwb3BwZXIgLSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gcmVmZXJlbmNlIC0gdGhlIHJlZmVyZW5jZSBlbGVtZW50ICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEBwYXJhbSB7RWxlbWVudH0gZml4ZWRQb3NpdGlvbiAtIGlzIGluIGZpeGVkIHBvc2l0aW9uIG1vZGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlKSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHZhciBjb21tb25PZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG4gIHJldHVybiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUocmVmZXJlbmNlLCBjb21tb25PZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3V0ZXIgc2l6ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG9mZnNldCBzaXplICsgbWFyZ2lucylcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldE91dGVyU2l6ZXMoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wIHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luQm90dG9tIHx8IDApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCB8fCAwKTtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCArIHksXG4gICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCArIHhcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudFxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgdmFyIGhhc2ggPSB7IGxlZnQ6ICdyaWdodCcsIHJpZ2h0OiAnbGVmdCcsIGJvdHRvbTogJ3RvcCcsIHRvcDogJ2JvdHRvbScgfTtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gQ1NTIHBvc2l0aW9uIHRoZSBQb3BwZXIgd2lsbCBnZXQgYXBwbGllZFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0cyAtIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGxhY2VtZW50IC0gb25lIG9mIHRoZSB2YWxpZCBwbGFjZW1lbnQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gcG9wcGVyT2Zmc2V0cyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFBvcHBlck9mZnNldHMocG9wcGVyLCByZWZlcmVuY2VPZmZzZXRzLCBwbGFjZW1lbnQpIHtcbiAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgLy8gR2V0IHBvcHBlciBub2RlIHNpemVzXG4gIHZhciBwb3BwZXJSZWN0ID0gZ2V0T3V0ZXJTaXplcyhwb3BwZXIpO1xuXG4gIC8vIEFkZCBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3RcbiAgdmFyIHBvcHBlck9mZnNldHMgPSB7XG4gICAgd2lkdGg6IHBvcHBlclJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBwb3BwZXJSZWN0LmhlaWdodFxuICB9O1xuXG4gIC8vIGRlcGVuZGluZyBieSB0aGUgcG9wcGVyIHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgdmFyIGlzSG9yaXogPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgbWFpblNpZGUgPSBpc0hvcml6ID8gJ3RvcCcgOiAnbGVmdCc7XG4gIHZhciBzZWNvbmRhcnlTaWRlID0gaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc0hvcml6ID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2Vjb25kYXJ5TWVhc3VyZW1lbnQgPSAhaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBwb3BwZXJPZmZzZXRzW21haW5TaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbbWFpblNpZGVdICsgcmVmZXJlbmNlT2Zmc2V0c1ttZWFzdXJlbWVudF0gLyAyIC0gcG9wcGVyUmVjdFttZWFzdXJlbWVudF0gLyAyO1xuICBpZiAocGxhY2VtZW50ID09PSBzZWNvbmRhcnlTaWRlKSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gLSBwb3BwZXJSZWN0W3NlY29uZGFyeU1lYXN1cmVtZW50XTtcbiAgfSBlbHNlIHtcbiAgICBwb3BwZXJPZmZzZXRzW3NlY29uZGFyeVNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1tnZXRPcHBvc2l0ZVBsYWNlbWVudChzZWNvbmRhcnlTaWRlKV07XG4gIH1cblxuICByZXR1cm4gcG9wcGVyT2Zmc2V0cztcbn1cblxuLyoqXG4gKiBNaW1pY3MgdGhlIGBmaW5kYCBtZXRob2Qgb2YgQXJyYXlcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZChhcnIsIGNoZWNrKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZCBpZiBzdXBwb3J0ZWRcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgcmV0dXJuIGFyci5maW5kKGNoZWNrKTtcbiAgfVxuXG4gIC8vIHVzZSBgZmlsdGVyYCB0byBvYnRhaW4gdGhlIHNhbWUgYmVoYXZpb3Igb2YgYGZpbmRgXG4gIHJldHVybiBhcnIuZmlsdGVyKGNoZWNrKVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtYXRjaGluZyBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFyciwgcHJvcCwgdmFsdWUpIHtcbiAgLy8gdXNlIG5hdGl2ZSBmaW5kSW5kZXggaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KSB7XG4gICAgcmV0dXJuIGFyci5maW5kSW5kZXgoZnVuY3Rpb24gKGN1cikge1xuICAgICAgcmV0dXJuIGN1cltwcm9wXSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyB1c2UgYGZpbmRgICsgYGluZGV4T2ZgIGlmIGBmaW5kSW5kZXhgIGlzbid0IHN1cHBvcnRlZFxuICB2YXIgbWF0Y2ggPSBmaW5kKGFyciwgZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmpbcHJvcF0gPT09IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIGFyci5pbmRleE9mKG1hdGNoKTtcbn1cblxuLyoqXG4gKiBMb29wIHRyb3VnaCB0aGUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIHJ1biB0aGVtIGluIG9yZGVyLFxuICogZWFjaCBvZiB0aGVtIHdpbGwgdGhlbiBlZGl0IHRoZSBkYXRhIG9iamVjdC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5kcyAtIE9wdGlvbmFsIG1vZGlmaWVyIG5hbWUgdXNlZCBhcyBzdG9wcGVyXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH1cbiAqL1xuZnVuY3Rpb24gcnVuTW9kaWZpZXJzKG1vZGlmaWVycywgZGF0YSwgZW5kcykge1xuICB2YXIgbW9kaWZpZXJzVG9SdW4gPSBlbmRzID09PSB1bmRlZmluZWQgPyBtb2RpZmllcnMgOiBtb2RpZmllcnMuc2xpY2UoMCwgZmluZEluZGV4KG1vZGlmaWVycywgJ25hbWUnLCBlbmRzKSk7XG5cbiAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXJbJ2Z1bmN0aW9uJ10pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ2Btb2RpZmllci5mdW5jdGlvbmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBtb2RpZmllci5mbmAhJyk7XG4gICAgfVxuICAgIHZhciBmbiA9IG1vZGlmaWVyWydmdW5jdGlvbiddIHx8IG1vZGlmaWVyLmZuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgIGlmIChtb2RpZmllci5lbmFibGVkICYmIGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAvLyBBZGQgcHJvcGVydGllcyB0byBvZmZzZXRzIHRvIG1ha2UgdGhlbSBhIGNvbXBsZXRlIGNsaWVudFJlY3Qgb2JqZWN0XG4gICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBlYWNoIG1vZGlmaWVyIHRvIG1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgb25lIGRvZXNuJ3RcbiAgICAgIC8vIG1lc3Mgd2l0aCB0aGVzZSB2YWx1ZXNcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuICAgICAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSk7XG5cbiAgICAgIGRhdGEgPSBmbihkYXRhLCBtb2RpZmllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wcGVyLCBjb21wdXRpbmcgdGhlIG5ldyBvZmZzZXRzIGFuZCBhcHBseWluZ1xuICogdGhlIG5ldyBzdHlsZS48YnIgLz5cbiAqIFByZWZlciBgc2NoZWR1bGVVcGRhdGVgIG92ZXIgYHVwZGF0ZWAgYmVjYXVzZSBvZiBwZXJmb3JtYW5jZSByZWFzb25zLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiB1cGRhdGUoKSB7XG4gIC8vIGlmIHBvcHBlciBpcyBkZXN0cm95ZWQsIGRvbid0IHBlcmZvcm0gYW55IGZ1cnRoZXIgdXBkYXRlXG4gIGlmICh0aGlzLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRhdGEgPSB7XG4gICAgaW5zdGFuY2U6IHRoaXMsXG4gICAgc3R5bGVzOiB7fSxcbiAgICBhcnJvd1N0eWxlczoge30sXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgZmxpcHBlZDogZmFsc2UsXG4gICAgb2Zmc2V0czoge31cbiAgfTtcblxuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZU9mZnNldHModGhpcy5zdGF0ZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIGRhdGEucGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQodGhpcy5vcHRpb25zLnBsYWNlbWVudCwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICAvLyBzdG9yZSB0aGUgY29tcHV0ZWQgcGxhY2VtZW50IGluc2lkZSBgb3JpZ2luYWxQbGFjZW1lbnRgXG4gIGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcblxuICBkYXRhLnBvc2l0aW9uRml4ZWQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZDtcblxuICAvLyBjb21wdXRlIHRoZSBwb3BwZXIgb2Zmc2V0c1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0UG9wcGVyT2Zmc2V0cyh0aGlzLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnO1xuXG4gIC8vIHJ1biB0aGUgbW9kaWZpZXJzXG4gIGRhdGEgPSBydW5Nb2RpZmllcnModGhpcy5tb2RpZmllcnMsIGRhdGEpO1xuXG4gIC8vIHRoZSBmaXJzdCBgdXBkYXRlYCB3aWxsIGNhbGwgYG9uQ3JlYXRlYCBjYWxsYmFja1xuICAvLyB0aGUgb3RoZXIgb25lcyB3aWxsIGNhbGwgYG9uVXBkYXRlYCBjYWxsYmFja1xuICBpZiAoIXRoaXMuc3RhdGUuaXNDcmVhdGVkKSB7XG4gICAgdGhpcy5zdGF0ZS5pc0NyZWF0ZWQgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMub25VcGRhdGUoZGF0YSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBpcyBlbmFibGVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTW9kaWZpZXJFbmFibGVkKG1vZGlmaWVycywgbW9kaWZpZXJOYW1lKSB7XG4gIHJldHVybiBtb2RpZmllcnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICBlbmFibGVkID0gX3JlZi5lbmFibGVkO1xuICAgIHJldHVybiBlbmFibGVkICYmIG5hbWUgPT09IG1vZGlmaWVyTmFtZTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmaXhlZCBzdXBwb3J0ZWQgcHJvcGVydHkgbmFtZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5IChjYW1lbENhc2UpXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBwcmVmaXhlZCBwcm9wZXJ0eSAoY2FtZWxDYXNlIG9yIFBhc2NhbENhc2UsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIHByZWZpeClcbiAqL1xuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKHByb3BlcnR5KSB7XG4gIHZhciBwcmVmaXhlcyA9IFtmYWxzZSwgJ21zJywgJ1dlYmtpdCcsICdNb3onLCAnTyddO1xuICB2YXIgdXBwZXJQcm9wID0gcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgIHZhciB0b0NoZWNrID0gcHJlZml4ID8gJycgKyBwcmVmaXggKyB1cHBlclByb3AgOiBwcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIHBvcHBlci5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgLy8gdG91Y2ggRE9NIG9ubHkgaWYgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGlzIGVuYWJsZWRcbiAgaWYgKGlzTW9kaWZpZXJFbmFibGVkKHRoaXMubW9kaWZpZXJzLCAnYXBwbHlTdHlsZScpKSB7XG4gICAgdGhpcy5wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUudG9wID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUubGVmdCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnJpZ2h0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlW2dldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyldID0gJyc7XG4gIH1cblxuICB0aGlzLmRpc2FibGVFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIHJlbW92ZSB0aGUgcG9wcGVyIGlmIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgdGhlIGRlbGV0aW9uIG9uIGRlc3Ryb3lcbiAgLy8gZG8gbm90IHVzZSBgcmVtb3ZlYCBiZWNhdXNlIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0XG4gIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlT25EZXN0cm95KSB7XG4gICAgdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlcik7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogR2V0IHRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtZW50KSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhzY3JvbGxQYXJlbnQsIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cykge1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50Lm5vZGVOYW1lID09PSAnQk9EWSc7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBzY3JvbGxQYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHNjcm9sbFBhcmVudDtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgaWYgKCFpc0JvZHkpIHtcbiAgICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoZ2V0U2Nyb2xsUGFyZW50KHRhcmdldC5wYXJlbnROb2RlKSwgZXZlbnQsIGNhbGxiYWNrLCBzY3JvbGxQYXJlbnRzKTtcbiAgfVxuICBzY3JvbGxQYXJlbnRzLnB1c2godGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBvcHRpb25zLCBzdGF0ZSwgdXBkYXRlQm91bmQpIHtcbiAgLy8gUmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBzdGF0ZS51cGRhdGVCb3VuZCA9IHVwZGF0ZUJvdW5kO1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICB2YXIgc2Nyb2xsRWxlbWVudCA9IGdldFNjcm9sbFBhcmVudChyZWZlcmVuY2UpO1xuICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsRWxlbWVudCwgJ3Njcm9sbCcsIHN0YXRlLnVwZGF0ZUJvdW5kLCBzdGF0ZS5zY3JvbGxQYXJlbnRzKTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQ7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIGFkZCByZXNpemUvc2Nyb2xsIGV2ZW50cyBhbmQgc3RhcnQgcmVjYWxjdWxhdGluZ1xuICogcG9zaXRpb24gb2YgdGhlIHBvcHBlciBlbGVtZW50IHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKCF0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc2V0dXBFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLCB0aGlzLnN0YXRlLCB0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBzdGF0ZSkge1xuICAvLyBSZW1vdmUgcmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG5cbiAgLy8gUmVtb3ZlIHNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICBzdGF0ZS5zY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG4gIH0pO1xuXG4gIC8vIFJlc2V0IHN0YXRlXG4gIHN0YXRlLnVwZGF0ZUJvdW5kID0gbnVsbDtcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IFtdO1xuICBzdGF0ZS5zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGZhbHNlO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCByZW1vdmUgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHdvbid0IHJlY2FsY3VsYXRlIHBvcHBlciBwb3NpdGlvblxuICogd2hlbiB0aGV5IGFyZSB0cmlnZ2VyZWQuIEl0IGFsc28gd29uJ3QgdHJpZ2dlciBgb25VcGRhdGVgIGNhbGxiYWNrIGFueW1vcmUsXG4gKiB1bmxlc3MgeW91IGNhbGwgYHVwZGF0ZWAgbWV0aG9kIG1hbnVhbGx5LlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICh0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgICB0aGlzLnN0YXRlID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMuc3RhdGUpO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgaWYgYSBnaXZlbiBpbnB1dCBpcyBhIG51bWJlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHsqfSBpbnB1dCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuIG4gIT09ICcnICYmICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB1bml0ID0gJyc7XG4gICAgLy8gYWRkIHVuaXQgaWYgdGhlIHZhbHVlIGlzIG51bWVyaWMgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gICAgaWYgKFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLmluZGV4T2YocHJvcCkgIT09IC0xICYmIGlzTnVtZXJpYyhzdHlsZXNbcHJvcF0pKSB7XG4gICAgICB1bml0ID0gJ3B4JztcbiAgICB9XG4gICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGVzIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbcHJvcF07XG4gICAgaWYgKHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcCwgYXR0cmlidXRlc1twcm9wXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5zdHlsZXMgLSBMaXN0IG9mIHN0eWxlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLmF0dHJpYnV0ZXMgLSBMaXN0IG9mIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBkYXRhIG9iamVjdFxuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlKGRhdGEpIHtcbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuc3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gaW4gdGhpcyB3YXkgd2UgY2FuIG1ha2UgdGhlIDNyZCBwYXJ0eSBtb2RpZmllcnMgYWRkIGN1c3RvbSBzdHlsZXMgdG8gaXRcbiAgLy8gQmUgYXdhcmUsIG1vZGlmaWVycyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91c1xuICAvLyBsaW5lcyBvZiB0aGlzIG1vZGlmaWVyIVxuICBzZXRTdHlsZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuc3R5bGVzKTtcblxuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5hdHRyaWJ1dGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gdGhleSB3aWxsIGJlIHNldCBhcyBIVE1MIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnRcbiAgc2V0QXR0cmlidXRlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgZGVmaW5lZCBhbmQgYXJyb3dTdHlsZXMgaGFzIHNvbWUgcHJvcGVydGllc1xuICBpZiAoZGF0YS5hcnJvd0VsZW1lbnQgJiYgT2JqZWN0LmtleXMoZGF0YS5hcnJvd1N0eWxlcykubGVuZ3RoKSB7XG4gICAgc2V0U3R5bGVzKGRhdGEuYXJyb3dFbGVtZW50LCBkYXRhLmFycm93U3R5bGVzKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNldCB0aGUgeC1wbGFjZW1lbnQgYXR0cmlidXRlIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UgYmVjYXVzZSBpdCBjb3VsZCBiZSB1c2VkXG4gKiB0byBhZGQgbWFyZ2lucyB0byB0aGUgcG9wcGVyIG1hcmdpbnMgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB0byBnZXQgdGhlXG4gKiBjb3JyZWN0IHBvcHBlciBvZmZzZXRzLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUG9wcGVyLmpzIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZU9uTG9hZChyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBzdGF0ZSkge1xuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgdmFyIHJlZmVyZW5jZU9mZnNldHMgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBjb21wdXRlIGF1dG8gcGxhY2VtZW50LCBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCxcbiAgLy8gbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAvLyBhbmQgcmVmZXIgdG8gb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgdmFyIHBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KG9wdGlvbnMucGxhY2VtZW50LCByZWZlcmVuY2VPZmZzZXRzLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICBwb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIHBsYWNlbWVudCk7XG5cbiAgLy8gQXBwbHkgYHBvc2l0aW9uYCB0byBwb3BwZXIgYmVmb3JlIGFueXRoaW5nIGVsc2UgYmVjYXVzZVxuICAvLyB3aXRob3V0IHRoZSBwb3NpdGlvbiBhcHBsaWVkIHdlIGNhbid0IGd1YXJhbnRlZSBjb3JyZWN0IGNvbXB1dGF0aW9uc1xuICBzZXRTdHlsZXMocG9wcGVyLCB7IHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJyB9KTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gc2hvdWxkUm91bmQgLSBJZiB0aGUgb2Zmc2V0cyBzaG91bGQgYmUgcm91bmRlZCBhdCBhbGxcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwb3BwZXIncyBwb3NpdGlvbiBvZmZzZXRzIHJvdW5kZWRcbiAqXG4gKiBUaGUgdGFsZSBvZiBwaXhlbC1wZXJmZWN0IHBvc2l0aW9uaW5nLiBJdCdzIHN0aWxsIG5vdCAxMDAlIHBlcmZlY3QsIGJ1dCBhc1xuICogZ29vZCBhcyBpdCBjYW4gYmUgd2l0aGluIHJlYXNvbi5cbiAqIERpc2N1c3Npb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL0ZlelZyYXN0YS9wb3BwZXIuanMvcHVsbC83MTVcbiAqXG4gKiBMb3cgRFBJIHNjcmVlbnMgY2F1c2UgYSBwb3BwZXIgdG8gYmUgYmx1cnJ5IGlmIG5vdCB1c2luZyBmdWxsIHBpeGVscyAoU2FmYXJpXG4gKiBhcyB3ZWxsIG9uIEhpZ2ggRFBJIHNjcmVlbnMpLlxuICpcbiAqIEZpcmVmb3ggcHJlZmVycyBubyByb3VuZGluZyBmb3IgcG9zaXRpb25pbmcgYW5kIGRvZXMgbm90IGhhdmUgYmx1cnJpbmVzcyBvblxuICogaGlnaCBEUEkgc2NyZWVucy5cbiAqXG4gKiBPbmx5IGhvcml6b250YWwgcGxhY2VtZW50IGFuZCBsZWZ0L3JpZ2h0IHZhbHVlcyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHNob3VsZFJvdW5kKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICB2YXIgbm9Sb3VuZCA9IGZ1bmN0aW9uIG5vUm91bmQodikge1xuICAgIHJldHVybiB2O1xuICB9O1xuXG4gIHZhciByZWZlcmVuY2VXaWR0aCA9IHJvdW5kKHJlZmVyZW5jZS53aWR0aCk7XG4gIHZhciBwb3BwZXJXaWR0aCA9IHJvdW5kKHBvcHBlci53aWR0aCk7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRhdGEucGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBpc1ZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LmluZGV4T2YoJy0nKSAhPT0gLTE7XG4gIHZhciBzYW1lV2lkdGhQYXJpdHkgPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IHBvcHBlcldpZHRoICUgMjtcbiAgdmFyIGJvdGhPZGRXaWR0aCA9IHJlZmVyZW5jZVdpZHRoICUgMiA9PT0gMSAmJiBwb3BwZXJXaWR0aCAlIDIgPT09IDE7XG5cbiAgdmFyIGhvcml6b250YWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogaXNWZXJ0aWNhbCB8fCBpc1ZhcmlhdGlvbiB8fCBzYW1lV2lkdGhQYXJpdHkgPyByb3VuZCA6IGZsb29yO1xuICB2YXIgdmVydGljYWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogcm91bmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBob3Jpem9udGFsVG9JbnRlZ2VyKGJvdGhPZGRXaWR0aCAmJiAhaXNWYXJpYXRpb24gJiYgc2hvdWxkUm91bmQgPyBwb3BwZXIubGVmdCAtIDEgOiBwb3BwZXIubGVmdCksXG4gICAgdG9wOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIudG9wKSxcbiAgICBib3R0b206IHZlcnRpY2FsVG9JbnRlZ2VyKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBob3Jpem9udGFsVG9JbnRlZ2VyKHBvcHBlci5yaWdodClcbiAgfTtcbn1cblxudmFyIGlzRmlyZWZveCA9IGlzQnJvd3NlciAmJiAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZShkYXRhLCBvcHRpb25zKSB7XG4gIHZhciB4ID0gb3B0aW9ucy54LFxuICAgICAgeSA9IG9wdGlvbnMueTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgLy8gUmVtb3ZlIHRoaXMgbGVnYWN5IHN1cHBvcnQgaW4gUG9wcGVyLmpzIHYyXG5cbiAgdmFyIGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAnYXBwbHlTdHlsZSc7XG4gIH0pLmdwdUFjY2VsZXJhdGlvbjtcbiAgaWYgKGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBgZ3B1QWNjZWxlcmF0aW9uYCBvcHRpb24gbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXIgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUG9wcGVyLmpzIScpO1xuICB9XG4gIHZhciBncHVBY2NlbGVyYXRpb24gPSBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCA/IGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA6IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uO1xuXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuXG4gIC8vIFN0eWxlc1xuICB2YXIgc3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiBwb3BwZXIucG9zaXRpb25cbiAgfTtcblxuICB2YXIgb2Zmc2V0cyA9IGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDwgMiB8fCAhaXNGaXJlZm94KTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICAvLyB3aGVuIG9mZnNldFBhcmVudCBpcyA8aHRtbD4gdGhlIHBvc2l0aW9uaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiAoZXhjbHVkaW5nIHRoZSBzY3JvbGxiYXIpXG4gICAgLy8gYW5kIG5vdCB0aGUgYm90dG9tIG9mIHRoZSBodG1sIGVsZW1lbnRcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0ICsgb2Zmc2V0cy5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnRSZWN0LmhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IC1vZmZzZXRQYXJlbnRSZWN0LndpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVmdCA9IG9mZnNldHMubGVmdDtcbiAgfVxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uICYmIHByZWZpeGVkUHJvcGVydHkpIHtcbiAgICBzdHlsZXNbcHJlZml4ZWRQcm9wZXJ0eV0gPSAndHJhbnNsYXRlM2QoJyArIGxlZnQgKyAncHgsICcgKyB0b3AgKyAncHgsIDApJztcbiAgICBzdHlsZXNbc2lkZUFdID0gMDtcbiAgICBzdHlsZXNbc2lkZUJdID0gMDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9ICd0cmFuc2Zvcm0nO1xuICB9IGVsc2Uge1xuICAgIC8vIG90aHdlcmlzZSwgd2UgdXNlIHRoZSBzdGFuZGFyZCBgdG9wYCwgYGxlZnRgLCBgYm90dG9tYCBhbmQgYHJpZ2h0YCBwcm9wZXJ0aWVzXG4gICAgdmFyIGludmVydFRvcCA9IHNpZGVBID09PSAnYm90dG9tJyA/IC0xIDogMTtcbiAgICB2YXIgaW52ZXJ0TGVmdCA9IHNpZGVCID09PSAncmlnaHQnID8gLTEgOiAxO1xuICAgIHN0eWxlc1tzaWRlQV0gPSB0b3AgKiBpbnZlcnRUb3A7XG4gICAgc3R5bGVzW3NpZGVCXSA9IGxlZnQgKiBpbnZlcnRMZWZ0O1xuICAgIHN0eWxlcy53aWxsQ2hhbmdlID0gc2lkZUEgKyAnLCAnICsgc2lkZUI7XG4gIH1cblxuICAvLyBBdHRyaWJ1dGVzXG4gIHZhciBhdHRyaWJ1dGVzID0ge1xuICAgICd4LXBsYWNlbWVudCc6IGRhdGEucGxhY2VtZW50XG4gIH07XG5cbiAgLy8gVXBkYXRlIGBkYXRhYCBhdHRyaWJ1dGVzLCBzdHlsZXMgYW5kIGFycm93U3R5bGVzXG4gIGRhdGEuYXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBhdHRyaWJ1dGVzLCBkYXRhLmF0dHJpYnV0ZXMpO1xuICBkYXRhLnN0eWxlcyA9IF9leHRlbmRzKHt9LCBzdHlsZXMsIGRhdGEuc3R5bGVzKTtcbiAgZGF0YS5hcnJvd1N0eWxlcyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMuYXJyb3csIGRhdGEuYXJyb3dTdHlsZXMpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGRlcGVuZHMgZnJvbSBhbm90aGVyIG9uZS48YnIgLz5cbiAqIEl0IGNoZWNrcyBpZiB0aGUgbmVlZGVkIG1vZGlmaWVyIGlzIGxpc3RlZCBhbmQgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVycyAtIGxpc3Qgb2YgbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGluZ05hbWUgLSBuYW1lIG9mIHJlcXVlc3RpbmcgbW9kaWZpZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0ZWROYW1lIC0gbmFtZSBvZiByZXF1ZXN0ZWQgbW9kaWZpZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyUmVxdWlyZWQobW9kaWZpZXJzLCByZXF1ZXN0aW5nTmFtZSwgcmVxdWVzdGVkTmFtZSkge1xuICB2YXIgcmVxdWVzdGluZyA9IGZpbmQobW9kaWZpZXJzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgIHJldHVybiBuYW1lID09PSByZXF1ZXN0aW5nTmFtZTtcbiAgfSk7XG5cbiAgdmFyIGlzUmVxdWlyZWQgPSAhIXJlcXVlc3RpbmcgJiYgbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09IHJlcXVlc3RlZE5hbWUgJiYgbW9kaWZpZXIuZW5hYmxlZCAmJiBtb2RpZmllci5vcmRlciA8IHJlcXVlc3Rpbmcub3JkZXI7XG4gIH0pO1xuXG4gIGlmICghaXNSZXF1aXJlZCkge1xuICAgIHZhciBfcmVxdWVzdGluZyA9ICdgJyArIHJlcXVlc3RpbmdOYW1lICsgJ2AnO1xuICAgIHZhciByZXF1ZXN0ZWQgPSAnYCcgKyByZXF1ZXN0ZWROYW1lICsgJ2AnO1xuICAgIGNvbnNvbGUud2FybihyZXF1ZXN0ZWQgKyAnIG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5ICcgKyBfcmVxdWVzdGluZyArICcgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSAnICsgX3JlcXVlc3RpbmcgKyAnIScpO1xuICB9XG4gIHJldHVybiBpc1JlcXVpcmVkO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gYXJyb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyRhcnJvdztcblxuICAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrXG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnYXJyb3cnLCAna2VlcFRvZ2V0aGVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBhcnJvd0VsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGEgc3RyaW5nLCBzdXBwb3NlIGl0J3MgYSBDU1Mgc2VsZWN0b3JcbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIG5vdCBmb3VuZCwgZG9uJ3QgcnVuIHRoZSBtb2RpZmllclxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlIGFycm93RWxlbWVudCBpc24ndCBhIHF1ZXJ5IHNlbGVjdG9yIHdlIG11c3QgY2hlY2sgdGhhdCB0aGVcbiAgICAvLyBwcm92aWRlZCBET00gbm9kZSBpcyBjaGlsZCBvZiBpdHMgcG9wcGVyIG5vZGVcbiAgICBpZiAoIWRhdGEuaW5zdGFuY2UucG9wcGVyLmNvbnRhaW5zKGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93LmVsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNWZXJ0aWNhbCA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIHZhciBzaWRlQ2FwaXRhbGl6ZWQgPSBpc1ZlcnRpY2FsID8gJ1RvcCcgOiAnTGVmdCc7XG4gIHZhciBzaWRlID0gc2lkZUNhcGl0YWxpemVkLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBhbHRTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgdmFyIGFycm93RWxlbWVudFNpemUgPSBnZXRPdXRlclNpemVzKGFycm93RWxlbWVudClbbGVuXTtcblxuICAvL1xuICAvLyBleHRlbmRzIGtlZXBUb2dldGhlciBiZWhhdmlvciBtYWtpbmcgc3VyZSB0aGUgcG9wcGVyIGFuZCBpdHNcbiAgLy8gcmVmZXJlbmNlIGhhdmUgZW5vdWdoIHBpeGVscyBpbiBjb25qdW5jdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0pO1xuICB2YXIgcG9wcGVyQm9yZGVyU2lkZSA9IHBhcnNlRmxvYXQoY3NzWydib3JkZXInICsgc2lkZUNhcGl0YWxpemVkICsgJ1dpZHRoJ10pO1xuICB2YXIgc2lkZVZhbHVlID0gY2VudGVyIC0gZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtIHBvcHBlck1hcmdpblNpZGUgLSBwb3BwZXJCb3JkZXJTaWRlO1xuXG4gIC8vIHByZXZlbnQgYXJyb3dFbGVtZW50IGZyb20gYmVpbmcgcGxhY2VkIG5vdCBjb250aWd1b3VzbHkgdG8gaXRzIHBvcHBlclxuICBzaWRlVmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihwb3BwZXJbbGVuXSAtIGFycm93RWxlbWVudFNpemUsIHNpZGVWYWx1ZSksIDApO1xuXG4gIGRhdGEuYXJyb3dFbGVtZW50ID0gYXJyb3dFbGVtZW50O1xuICBkYXRhLm9mZnNldHMuYXJyb3cgPSAoX2RhdGEkb2Zmc2V0cyRhcnJvdyA9IHt9LCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBzaWRlLCBNYXRoLnJvdW5kKHNpZGVWYWx1ZSkpLCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBhbHRTaWRlLCAnJyksIF9kYXRhJG9mZnNldHMkYXJyb3cpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IHZhcmlhdGlvbiBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IHZhcmlhdGlvblxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbikge1xuICBpZiAodmFyaWF0aW9uID09PSAnZW5kJykge1xuICAgIHJldHVybiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHZhcmlhdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgIHJldHVybiAnZW5kJztcbiAgfVxuICByZXR1cm4gdmFyaWF0aW9uO1xufVxuXG4vKipcbiAqIExpc3Qgb2YgYWNjZXB0ZWQgcGxhY2VtZW50cyB0byB1c2UgYXMgdmFsdWVzIG9mIHRoZSBgcGxhY2VtZW50YCBvcHRpb24uPGJyIC8+XG4gKiBWYWxpZCBwbGFjZW1lbnRzIGFyZTpcbiAqIC0gYGF1dG9gXG4gKiAtIGB0b3BgXG4gKiAtIGByaWdodGBcbiAqIC0gYGJvdHRvbWBcbiAqIC0gYGxlZnRgXG4gKlxuICogRWFjaCBwbGFjZW1lbnQgY2FuIGhhdmUgYSB2YXJpYXRpb24gZnJvbSB0aGlzIGxpc3Q6XG4gKiAtIGAtc3RhcnRgXG4gKiAtIGAtZW5kYFxuICpcbiAqIFZhcmlhdGlvbnMgYXJlIGludGVycHJldGVkIGVhc2lseSBpZiB5b3UgdGhpbmsgb2YgdGhlbSBhcyB0aGUgbGVmdCB0byByaWdodFxuICogd3JpdHRlbiBsYW5ndWFnZXMuIEhvcml6b250YWxseSAoYHRvcGAgYW5kIGBib3R0b21gKSwgYHN0YXJ0YCBpcyBsZWZ0IGFuZCBgZW5kYFxuICogaXMgcmlnaHQuPGJyIC8+XG4gKiBWZXJ0aWNhbGx5IChgbGVmdGAgYW5kIGByaWdodGApLCBgc3RhcnRgIGlzIHRvcCBhbmQgYGVuZGAgaXMgYm90dG9tLlxuICpcbiAqIFNvbWUgdmFsaWQgZXhhbXBsZXMgYXJlOlxuICogLSBgdG9wLWVuZGAgKG9uIHRvcCBvZiByZWZlcmVuY2UsIHJpZ2h0IGFsaWduZWQpXG4gKiAtIGByaWdodC1zdGFydGAgKG9uIHJpZ2h0IG9mIHJlZmVyZW5jZSwgdG9wIGFsaWduZWQpXG4gKiAtIGBib3R0b21gIChvbiBib3R0b20sIGNlbnRlcmVkKVxuICogLSBgYXV0by1lbmRgIChvbiB0aGUgc2lkZSB3aXRoIG1vcmUgc3BhY2UgYXZhaWxhYmxlLCBhbGlnbm1lbnQgZGVwZW5kcyBieSBwbGFjZW1lbnQpXG4gKlxuICogQHN0YXRpY1xuICogQHR5cGUge0FycmF5fVxuICogQGVudW0ge1N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1ldGhvZCBwbGFjZW1lbnRzXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBwbGFjZW1lbnRzID0gWydhdXRvLXN0YXJ0JywgJ2F1dG8nLCAnYXV0by1lbmQnLCAndG9wLXN0YXJ0JywgJ3RvcCcsICd0b3AtZW5kJywgJ3JpZ2h0LXN0YXJ0JywgJ3JpZ2h0JywgJ3JpZ2h0LWVuZCcsICdib3R0b20tZW5kJywgJ2JvdHRvbScsICdib3R0b20tc3RhcnQnLCAnbGVmdC1lbmQnLCAnbGVmdCcsICdsZWZ0LXN0YXJ0J107XG5cbi8vIEdldCByaWQgb2YgYGF1dG9gIGBhdXRvLXN0YXJ0YCBhbmQgYGF1dG8tZW5kYFxudmFyIHZhbGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuc2xpY2UoMyk7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5pdGlhbCBwbGFjZW1lbnQsIHJldHVybnMgYWxsIHRoZSBzdWJzZXF1ZW50IHBsYWNlbWVudHNcbiAqIGNsb2Nrd2lzZSAob3IgY291bnRlci1jbG9ja3dpc2UpLlxuICpcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgLSBBIHZhbGlkIHBsYWNlbWVudCAoaXQgYWNjZXB0cyB2YXJpYXRpb25zKVxuICogQGFyZ3VtZW50IHtCb29sZWFufSBjb3VudGVyIC0gU2V0IHRvIHRydWUgdG8gd2FsayB0aGUgcGxhY2VtZW50cyBjb3VudGVyY2xvY2t3aXNlXG4gKiBAcmV0dXJucyB7QXJyYXl9IHBsYWNlbWVudHMgaW5jbHVkaW5nIHRoZWlyIHZhcmlhdGlvbnNcbiAqL1xuZnVuY3Rpb24gY2xvY2t3aXNlKHBsYWNlbWVudCkge1xuICB2YXIgY291bnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGluZGV4ID0gdmFsaWRQbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KTtcbiAgdmFyIGFyciA9IHZhbGlkUGxhY2VtZW50cy5zbGljZShpbmRleCArIDEpLmNvbmNhdCh2YWxpZFBsYWNlbWVudHMuc2xpY2UoMCwgaW5kZXgpKTtcbiAgcmV0dXJuIGNvdW50ZXIgPyBhcnIucmV2ZXJzZSgpIDogYXJyO1xufVxuXG52YXIgQkVIQVZJT1JTID0ge1xuICBGTElQOiAnZmxpcCcsXG4gIENMT0NLV0lTRTogJ2Nsb2Nrd2lzZScsXG4gIENPVU5URVJDTE9DS1dJU0U6ICdjb3VudGVyY2xvY2t3aXNlJ1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZsaXAoZGF0YSwgb3B0aW9ucykge1xuICAvLyBpZiBgaW5uZXJgIG1vZGlmaWVyIGlzIGVuYWJsZWQsIHdlIGNhbid0IHVzZSB0aGUgYGZsaXBgIG1vZGlmaWVyXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2lubmVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQpIHtcbiAgICAvLyBzZWVtcyBsaWtlIGZsaXAgaXMgdHJ5aW5nIHRvIGxvb3AsIHByb2JhYmx5IHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvbiBhbnkgb2YgdGhlIGZsaXBwYWJsZSBzaWRlc1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVsxXSB8fCAnJztcblxuICB2YXIgZmxpcE9yZGVyID0gW107XG5cbiAgc3dpdGNoIChvcHRpb25zLmJlaGF2aW9yKSB7XG4gICAgY2FzZSBCRUhBVklPUlMuRkxJUDpcbiAgICAgIGZsaXBPcmRlciA9IFtwbGFjZW1lbnQsIHBsYWNlbWVudE9wcG9zaXRlXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBCRUhBVklPUlMuQ09VTlRFUkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQsIHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZsaXBPcmRlciA9IG9wdGlvbnMuYmVoYXZpb3I7XG4gIH1cblxuICBmbGlwT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCwgaW5kZXgpIHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICBwbGFjZW1lbnRPcHBvc2l0ZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG4gICAgdmFyIHJlZk9mZnNldHMgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuXG4gICAgLy8gdXNpbmcgZmxvb3IgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgbWF5IGNvbnRhaW4gZGVjaW1hbHMgd2UgYXJlIG5vdCBnb2luZyB0byBjb25zaWRlciBoZXJlXG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgICB2YXIgb3ZlcmxhcHNSZWYgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnJpZ2h0KSA+IGZsb29yKHJlZk9mZnNldHMubGVmdCkgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihyZWZPZmZzZXRzLnJpZ2h0KSB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIGZsb29yKHBvcHBlck9mZnNldHMuYm90dG9tKSA+IGZsb29yKHJlZk9mZnNldHMudG9wKSB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKHJlZk9mZnNldHMuYm90dG9tKTtcblxuICAgIHZhciBvdmVyZmxvd3NMZWZ0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5sZWZ0KSA8IGZsb29yKGJvdW5kYXJpZXMubGVmdCk7XG4gICAgdmFyIG92ZXJmbG93c1JpZ2h0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihib3VuZGFyaWVzLnJpZ2h0KTtcbiAgICB2YXIgb3ZlcmZsb3dzVG9wID0gZmxvb3IocG9wcGVyT2Zmc2V0cy50b3ApIDwgZmxvb3IoYm91bmRhcmllcy50b3ApO1xuICAgIHZhciBvdmVyZmxvd3NCb3R0b20gPSBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihib3VuZGFyaWVzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzQm91bmRhcmllcyA9IHBsYWNlbWVudCA9PT0gJ2xlZnQnICYmIG92ZXJmbG93c0xlZnQgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IHBsYWNlbWVudCA9PT0gJ3RvcCcgJiYgb3ZlcmZsb3dzVG9wIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgJiYgb3ZlcmZsb3dzQm90dG9tO1xuXG4gICAgLy8gZmxpcCB0aGUgdmFyaWF0aW9uIGlmIHJlcXVpcmVkXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeVJlZiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICAvLyBmbGlwcyB2YXJpYXRpb24gaWYgcG9wcGVyIGNvbnRlbnQgb3ZlcmZsb3dzIGJvdW5kYXJpZXNcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudCA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9uc0J5Q29udGVudCAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0xlZnQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0JvdHRvbSB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1RvcCk7XG5cbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9IGZsaXBwZWRWYXJpYXRpb25CeVJlZiB8fCBmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50O1xuXG4gICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMgfHwgZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgLy8gdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wXG4gICAgICBkYXRhLmZsaXBwZWQgPSB0cnVlO1xuXG4gICAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcykge1xuICAgICAgICBwbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgICAgdmFyaWF0aW9uID0gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wbGFjZW1lbnQgPSBwbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gJy0nICsgdmFyaWF0aW9uIDogJycpO1xuXG4gICAgICAvLyB0aGlzIG9iamVjdCBjb250YWlucyBgcG9zaXRpb25gLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0IGFsb25nIHdpdGhcbiAgICAgIC8vIGFueSBhZGRpdGlvbmFsIHByb3BlcnR5IHdlIG1heSBhZGQgaW4gdGhlIGZ1dHVyZVxuICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMucG9wcGVyLCBnZXRQb3BwZXJPZmZzZXRzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCkpO1xuXG4gICAgICBkYXRhID0gcnVuTW9kaWZpZXJzKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBkYXRhLCAnZmxpcCcpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24ga2VlcFRvZ2V0aGVyKGRhdGEpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdyaWdodCcgOiAnYm90dG9tJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICBpZiAocG9wcGVyW3NpZGVdIDwgZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pIC0gcG9wcGVyW21lYXN1cmVtZW50XTtcbiAgfVxuICBpZiAocG9wcGVyW29wU2lkZV0gPiBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW3NpZGVdKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWUgKyB1bml0IGludG8gYSBweCB2YWx1ZSBudW1iZXJcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzdHIgLSBWYWx1ZSArIHVuaXQgc3RyaW5nXG4gKiBAYXJndW1lbnQge1N0cmluZ30gbWVhc3VyZW1lbnQgLSBgaGVpZ2h0YCBvciBgd2lkdGhgXG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ8U3RyaW5nfVxuICogVmFsdWUgaW4gcGl4ZWxzLCBvciBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdmFsdWVzIHdlcmUgZXh0cmFjdGVkXG4gKi9cbmZ1bmN0aW9uIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cykge1xuICAvLyBzZXBhcmF0ZSB2YWx1ZSBmcm9tIHVuaXRcbiAgdmFyIHNwbGl0ID0gc3RyLm1hdGNoKC8oKD86XFwtfFxcKyk/XFxkKlxcLj9cXGQqKSguKikvKTtcbiAgdmFyIHZhbHVlID0gK3NwbGl0WzFdO1xuICB2YXIgdW5pdCA9IHNwbGl0WzJdO1xuXG4gIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyIGl0J3MgYW4gb3BlcmF0b3IsIEkgZ3Vlc3NcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBpZiAodW5pdC5pbmRleE9mKCclJykgPT09IDApIHtcbiAgICB2YXIgZWxlbWVudCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJyVwJzpcbiAgICAgICAgZWxlbWVudCA9IHBvcHBlck9mZnNldHM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJSc6XG4gICAgICBjYXNlICclcic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbGVtZW50ID0gcmVmZXJlbmNlT2Zmc2V0cztcbiAgICB9XG5cbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3QoZWxlbWVudCk7XG4gICAgcmV0dXJuIHJlY3RbbWVhc3VyZW1lbnRdIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3ZoJyB8fCB1bml0ID09PSAndncnKSB7XG4gICAgLy8gaWYgaXMgYSB2aCBvciB2dywgd2UgY2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHRoZSB2aWV3cG9ydFxuICAgIHZhciBzaXplID0gdm9pZCAwO1xuICAgIGlmICh1bml0ID09PSAndmgnKSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemUgLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBpcyBhbiBleHBsaWNpdCBwaXhlbCB1bml0LCB3ZSBnZXQgcmlkIG9mIHRoZSB1bml0IGFuZCBrZWVwIHRoZSB2YWx1ZVxuICAgIC8vIGlmIGlzIGFuIGltcGxpY2l0IHVuaXQsIGl0J3MgcHgsIGFuZCB3ZSByZXR1cm4ganVzdCB0aGUgdmFsdWVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBgb2Zmc2V0YCBzdHJpbmcgdG8gZXh0cmFwb2xhdGUgYHhgIGFuZCBgeWAgbnVtZXJpYyBvZmZzZXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IG9mZnNldFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gYmFzZVBsYWNlbWVudFxuICogQHJldHVybnMge0FycmF5fSBhIHR3byBjZWxscyBhcnJheSB3aXRoIHggYW5kIHkgb2Zmc2V0cyBpbiBudW1iZXJzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cywgYmFzZVBsYWNlbWVudCkge1xuICB2YXIgb2Zmc2V0cyA9IFswLCAwXTtcblxuICAvLyBVc2UgaGVpZ2h0IGlmIHBsYWNlbWVudCBpcyBsZWZ0IG9yIHJpZ2h0IGFuZCBpbmRleCBpcyAwIG90aGVyd2lzZSB1c2Ugd2lkdGhcbiAgLy8gaW4gdGhpcyB3YXkgdGhlIGZpcnN0IG9mZnNldCB3aWxsIHVzZSBhbiBheGlzIGFuZCB0aGUgc2Vjb25kIG9uZVxuICAvLyB3aWxsIHVzZSB0aGUgb3RoZXIgb25lXG4gIHZhciB1c2VIZWlnaHQgPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAvLyBTcGxpdCB0aGUgb2Zmc2V0IHN0cmluZyB0byBvYnRhaW4gYSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHNcbiAgLy8gVGhlIHJlZ2V4IGFkZHJlc3NlcyB2YWx1ZXMgd2l0aCB0aGUgcGx1cyBvciBtaW51cyBzaWduIGluIGZyb250ICgrMTAsIC0yMCwgZXRjKVxuICB2YXIgZnJhZ21lbnRzID0gb2Zmc2V0LnNwbGl0KC8oXFwrfFxcLSkvKS5tYXAoZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy50cmltKCk7XG4gIH0pO1xuXG4gIC8vIERldGVjdCBpZiB0aGUgb2Zmc2V0IHN0cmluZyBjb250YWlucyBhIHBhaXIgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIG9uZVxuICAvLyB0aGV5IGNvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYSBvciBzcGFjZVxuICB2YXIgZGl2aWRlciA9IGZyYWdtZW50cy5pbmRleE9mKGZpbmQoZnJhZ21lbnRzLCBmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnNlYXJjaCgvLHxcXHMvKSAhPT0gLTE7XG4gIH0pKTtcblxuICBpZiAoZnJhZ21lbnRzW2RpdmlkZXJdICYmIGZyYWdtZW50c1tkaXZpZGVyXS5pbmRleE9mKCcsJykgPT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdPZmZzZXRzIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZShzKSBhcmUgZGVwcmVjYXRlZCwgdXNlIGEgY29tbWEgKCwpIGluc3RlYWQuJyk7XG4gIH1cblxuICAvLyBJZiBkaXZpZGVyIGlzIGZvdW5kLCB3ZSBkaXZpZGUgdGhlIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kcyB0byBkaXZpZGVcbiAgLy8gdGhlbSBieSBvZnNldCBYIGFuZCBZLlxuICB2YXIgc3BsaXRSZWdleCA9IC9cXHMqLFxccyp8XFxzKy87XG4gIHZhciBvcHMgPSBkaXZpZGVyICE9PSAtMSA/IFtmcmFnbWVudHMuc2xpY2UoMCwgZGl2aWRlcikuY29uY2F0KFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMF1dKSwgW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVsxXV0uY29uY2F0KGZyYWdtZW50cy5zbGljZShkaXZpZGVyICsgMSkpXSA6IFtmcmFnbWVudHNdO1xuXG4gIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB3aXRoIHVuaXRzIHRvIGFic29sdXRlIHBpeGVscyB0byBhbGxvdyBvdXIgY29tcHV0YXRpb25zXG4gIG9wcyA9IG9wcy5tYXAoZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIC8vIE1vc3Qgb2YgdGhlIHVuaXRzIHJlbHkgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwb3BwZXJcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSAoaW5kZXggPT09IDEgPyAhdXNlSGVpZ2h0IDogdXNlSGVpZ2h0KSA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3BcbiAgICAvLyBUaGlzIGFnZ3JlZ2F0ZXMgYW55IGArYCBvciBgLWAgc2lnbiB0aGF0IGFyZW4ndCBjb25zaWRlcmVkIG9wZXJhdG9yc1xuICAgIC8vIGUuZy46IDEwICsgKzUgPT4gWzEwLCArLCArNV1cbiAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZiAoYVthLmxlbmd0aCAtIDFdID09PSAnJyAmJiBbJysnLCAnLSddLmluZGV4T2YoYikgIT09IC0xKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSA9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2UgaWYgKG1lcmdlV2l0aFByZXZpb3VzKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSArPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgICAvLyBIZXJlIHdlIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZXMgaW50byBudW1iZXIgdmFsdWVzIChpbiBweClcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMb29wIHRyb3VnaCB0aGUgb2Zmc2V0cyBhcnJheXMgYW5kIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnNcbiAgb3BzLmZvckVhY2goZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIG9wLmZvckVhY2goZnVuY3Rpb24gKGZyYWcsIGluZGV4Mikge1xuICAgICAgaWYgKGlzTnVtZXJpYyhmcmFnKSkge1xuICAgICAgICBvZmZzZXRzW2luZGV4XSArPSBmcmFnICogKG9wW2luZGV4MiAtIDFdID09PSAnLScgPyAtMSA6IDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQGFyZ3VtZW50IHtOdW1iZXJ8U3RyaW5nfSBvcHRpb25zLm9mZnNldD0wXG4gKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gb2Zmc2V0KGRhdGEsIF9yZWYpIHtcbiAgdmFyIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQsXG4gICAgICBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIHZhciBvZmZzZXRzID0gdm9pZCAwO1xuICBpZiAoaXNOdW1lcmljKCtvZmZzZXQpKSB7XG4gICAgb2Zmc2V0cyA9IFsrb2Zmc2V0LCAwXTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXRzID0gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYmFzZVBsYWNlbWVudCk7XG4gIH1cblxuICBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0IC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wIC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1sxXTtcbiAgfVxuXG4gIGRhdGEucG9wcGVyID0gcG9wcGVyO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCB8fCBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuXG4gIC8vIElmIG9mZnNldFBhcmVudCBpcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIHJlYWxseSB3YW50IHRvXG4gIC8vIGdvIG9uZSBzdGVwIHVwIGFuZCB1c2UgdGhlIG5leHQgb2Zmc2V0UGFyZW50IGFzIHJlZmVyZW5jZSB0b1xuICAvLyBhdm9pZCB0byBtYWtlIHRoaXMgbW9kaWZpZXIgY29tcGxldGVseSB1c2VsZXNzIGFuZCBsb29rIGxpa2UgYnJva2VuXG4gIGlmIChkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICBib3VuZGFyaWVzRWxlbWVudCA9IGdldE9mZnNldFBhcmVudChib3VuZGFyaWVzRWxlbWVudCk7XG4gIH1cblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzZXRzIHRoZSBwb3BwZXIncyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBkb2N1bWVudCBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGV4Y2x1ZGluZ1xuICAvLyB0aGUgc2l6ZSBvZiB0aGUgcG9wcGVyIGVsZW1lbnQgaXRzZWxmXG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKTtcbiAgdmFyIHBvcHBlclN0eWxlcyA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnN0eWxlOyAvLyBhc3NpZ25tZW50IHRvIGhlbHAgbWluaWZpY2F0aW9uXG4gIHZhciB0b3AgPSBwb3BwZXJTdHlsZXMudG9wLFxuICAgICAgbGVmdCA9IHBvcHBlclN0eWxlcy5sZWZ0LFxuICAgICAgdHJhbnNmb3JtID0gcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdO1xuXG4gIHBvcHBlclN0eWxlcy50b3AgPSAnJztcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSAnJztcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gJyc7XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0eWxlIHByb3BlcnRpZXMgYWZ0ZXIgdGhlIG9mZnNldHMgaGF2ZSBiZWVuIGNvbXB1dGVkXG4gIHBvcHBlclN0eWxlcy50b3AgPSB0b3A7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gbGVmdDtcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtO1xuXG4gIG9wdGlvbnMuYm91bmRhcmllcyA9IGJvdW5kYXJpZXM7XG5cbiAgdmFyIG9yZGVyID0gb3B0aW9ucy5wcmlvcml0eTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgdmFyIGNoZWNrID0ge1xuICAgIHByaW1hcnk6IGZ1bmN0aW9uIHByaW1hcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbcGxhY2VtZW50XTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA8IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5tYXgocG9wcGVyW3BsYWNlbWVudF0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIHBsYWNlbWVudCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2Vjb25kYXJ5OiBmdW5jdGlvbiBzZWNvbmRhcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgbWFpblNpZGUgPSBwbGFjZW1lbnQgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAndG9wJztcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlclttYWluU2lkZV07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPiBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWluKHBvcHBlclttYWluU2lkZV0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSAtIChwbGFjZW1lbnQgPT09ICdyaWdodCcgPyBwb3BwZXIud2lkdGggOiBwb3BwZXIuaGVpZ2h0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIG1haW5TaWRlLCB2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHZhciBzaWRlID0gWydsZWZ0JywgJ3RvcCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTEgPyAncHJpbWFyeScgOiAnc2Vjb25kYXJ5JztcbiAgICBwb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBjaGVja1tzaWRlXShwbGFjZW1lbnQpKTtcbiAgfSk7XG5cbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IHBvcHBlcjtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gc2hpZnQoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBzaGlmdHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIC8vIGlmIHNoaWZ0IHNoaWZ0dmFyaWF0aW9uIGlzIHNwZWNpZmllZCwgcnVuIHRoZSBtb2RpZmllclxuICBpZiAoc2hpZnR2YXJpYXRpb24pIHtcbiAgICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyO1xuXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ2JvdHRvbScsICd0b3AnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgdmFyIHNoaWZ0T2Zmc2V0cyA9IHtcbiAgICAgIHN0YXJ0OiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdKSxcbiAgICAgIGVuZDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVttZWFzdXJlbWVudF0gLSBwb3BwZXJbbWVhc3VyZW1lbnRdKVxuICAgIH07XG5cbiAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgc2hpZnRPZmZzZXRzW3NoaWZ0dmFyaWF0aW9uXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGhpZGUoZGF0YSkge1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2hpZGUnLCAncHJldmVudE92ZXJmbG93JykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciByZWZSZWN0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIGJvdW5kID0gZmluZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09ICdwcmV2ZW50T3ZlcmZsb3cnO1xuICB9KS5ib3VuZGFyaWVzO1xuXG4gIGlmIChyZWZSZWN0LmJvdHRvbSA8IGJvdW5kLnRvcCB8fCByZWZSZWN0LmxlZnQgPiBib3VuZC5yaWdodCB8fCByZWZSZWN0LnRvcCA+IGJvdW5kLmJvdHRvbSB8fCByZWZSZWN0LnJpZ2h0IDwgYm91bmQubGVmdCkge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IHRydWU7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gZmFsc2U7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBpbm5lcihkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBpc0hvcml6ID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIHN1YnRyYWN0TGVuZ3RoID0gWyd0b3AnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPT09IC0xO1xuXG4gIHBvcHBlcltpc0hvcml6ID8gJ2xlZnQnIDogJ3RvcCddID0gcmVmZXJlbmNlW2Jhc2VQbGFjZW1lbnRdIC0gKHN1YnRyYWN0TGVuZ3RoID8gcG9wcGVyW2lzSG9yaXogPyAnd2lkdGgnIDogJ2hlaWdodCddIDogMCk7XG5cbiAgZGF0YS5wbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChwb3BwZXIpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE1vZGlmaWVyIGZ1bmN0aW9uLCBlYWNoIG1vZGlmaWVyIGNhbiBoYXZlIGEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGFzc2lnbmVkXG4gKiB0byBpdHMgYGZuYCBwcm9wZXJ0eS48YnIgLz5cbiAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZSwgdGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0XG4gKiBtYWtlIHN1cmUgdGhleSBhcmUgcGVyZm9ybWFudCBlbm91Z2ggdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuXG4gKlxuICogQGZ1bmN0aW9uIE1vZGlmaWVyRm5cbiAqIEBhcmd1bWVudCB7ZGF0YU9iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5cbi8qKlxuICogTW9kaWZpZXJzIGFyZSBwbHVnaW5zIHVzZWQgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIgcG9wcGVycy48YnIgLz5cbiAqIFBvcHBlci5qcyB1c2VzIGEgc2V0IG9mIDkgbW9kaWZpZXJzIHRvIHByb3ZpZGUgYWxsIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXRpZXNcbiAqIG5lZWRlZCBieSB0aGUgbGlicmFyeS5cbiAqXG4gKiBVc3VhbGx5IHlvdSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgb3JkZXJgLCBgZm5gIGFuZCBgb25Mb2FkYCBwcm9wcy5cbiAqIEFsbCB0aGUgb3RoZXIgcHJvcGVydGllcyBhcmUgY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSB0d2Vha2VkLlxuICogQG5hbWVzcGFjZSBtb2RpZmllcnNcbiAqL1xudmFyIG1vZGlmaWVycyA9IHtcbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc3RhcnQgb3IgZW5kIG9mIGl0cyByZWZlcmVuY2VcbiAgICogZWxlbWVudC48YnIgLz5cbiAgICogSXQgd2lsbCByZWFkIHRoZSB2YXJpYXRpb24gb2YgdGhlIGBwbGFjZW1lbnRgIHByb3BlcnR5LjxiciAvPlxuICAgKiBJdCBjYW4gYmUgb25lIGVpdGhlciBgLWVuZGAgb3IgYC1zdGFydGAuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBzaGlmdDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0xMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDEwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHNoaWZ0XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgb2Zmc2V0YCBtb2RpZmllciBjYW4gc2hpZnQgeW91ciBwb3BwZXIgb24gYm90aCBpdHMgYXhpcy5cbiAgICpcbiAgICogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHVuaXRzOlxuICAgKiAtIGBweGAgb3IgdW5pdC1sZXNzLCBpbnRlcnByZXRlZCBhcyBwaXhlbHNcbiAgICogLSBgJWAgb3IgYCVyYCwgcGVyY2VudGFnZSByZWxhdGl2ZSB0byB0aGUgbGVuZ3RoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgKiAtIGAlcGAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcG9wcGVyIGVsZW1lbnRcbiAgICogLSBgdndgLCBDU1Mgdmlld3BvcnQgd2lkdGggdW5pdFxuICAgKiAtIGB2aGAsIENTUyB2aWV3cG9ydCBoZWlnaHQgdW5pdFxuICAgKlxuICAgKiBGb3IgbGVuZ3RoIGlzIGludGVuZGVkIHRoZSBtYWluIGF4aXMgcmVsYXRpdmUgdG8gdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyLjxiciAvPlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHBsYWNlbWVudCBpcyBgdG9wYCBvciBgYm90dG9tYCwgdGhlIGxlbmd0aCB3aWxsIGJlIHRoZVxuICAgKiBgd2lkdGhgLiBJbiBjYXNlIG9mIGBsZWZ0YCBvciBgcmlnaHRgLCBpdCB3aWxsIGJlIHRoZSBgaGVpZ2h0YC5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIGEgc2luZ2xlIHZhbHVlIChhcyBgTnVtYmVyYCBvciBgU3RyaW5nYCksIG9yIGEgcGFpciBvZiB2YWx1ZXNcbiAgICogYXMgYFN0cmluZ2AgZGl2aWRlZCBieSBhIGNvbW1hIG9yIG9uZSAob3IgbW9yZSkgd2hpdGUgc3BhY2VzLjxiciAvPlxuICAgKiBUaGUgbGF0dGVyIGlzIGEgZGVwcmVjYXRlZCBtZXRob2QgYmVjYXVzZSBpdCBsZWFkcyB0byBjb25mdXNpb24gYW5kIHdpbGwgYmVcbiAgICogcmVtb3ZlZCBpbiB2Mi48YnIgLz5cbiAgICogQWRkaXRpb25hbGx5LCBpdCBhY2NlcHRzIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IHVuaXRzLlxuICAgKiBOb3RlIHRoYXQgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMgYXJlbid0IHN1cHBvcnRlZC5cbiAgICpcbiAgICogVmFsaWQgZXhhbXBsZXMgYXJlOlxuICAgKiBgYGBcbiAgICogMTBcbiAgICogJzEwJSdcbiAgICogJzEwLCAxMCdcbiAgICogJzEwJSwgMTAnXG4gICAqICcxMCArIDEwJSdcbiAgICogJzEwIC0gNXZoICsgMyUnXG4gICAqICctMTBweCArIDV2aCwgNXB4IC0gNiUnXG4gICAqIGBgYFxuICAgKiA+ICoqTkIqKjogSWYgeW91IGRlc2lyZSB0byBhcHBseSBvZmZzZXRzIHRvIHlvdXIgcG9wcGVycyBpbiBhIHdheSB0aGF0IG1heSBtYWtlIHRoZW0gb3ZlcmxhcFxuICAgKiA+IHdpdGggdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnQsIHVuZm9ydHVuYXRlbHksIHlvdSB3aWxsIGhhdmUgdG8gZGlzYWJsZSB0aGUgYGZsaXBgIG1vZGlmaWVyLlxuICAgKiA+IFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgYXQgdGhpcyBbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgb2Zmc2V0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTIwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogb2Zmc2V0LFxuICAgIC8qKiBAcHJvcCB7TnVtYmVyfFN0cmluZ30gb2Zmc2V0PTBcbiAgICAgKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBvZmZzZXQ6IDBcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBwcmV2ZW50IHRoZSBwb3BwZXIgZnJvbSBiZWluZyBwb3NpdGlvbmVkIG91dHNpZGUgdGhlIGJvdW5kYXJ5LlxuICAgKlxuICAgKiBBIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIuIFRoaXMgbWFrZXMgc3VyZSB0aGUgcG9wcGVyIGFsd2F5cyBoYXMgYSBsaXR0bGUgcGFkZGluZ1xuICAgICAqIGJldHdlZW4gdGhlIGVkZ2VzIG9mIGl0cyBjb250YWluZXJcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSdzY3JvbGxQYXJlbnQnXG4gICAgICogQm91bmRhcmllcyB1c2VkIGJ5IHRoZSBtb2RpZmllci4gQ2FuIGJlIGBzY3JvbGxQYXJlbnRgLCBgd2luZG93YCxcbiAgICAgKiBgdmlld3BvcnRgIG9yIGFueSBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHJlZmVyZW5jZSBhbmQgaXRzIHBvcHBlciBzdGF5IG5lYXIgZWFjaCBvdGhlclxuICAgKiB3aXRob3V0IGxlYXZpbmcgYW55IGdhcCBiZXR3ZWVuIHRoZSB0d28uIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIGFycm93IGlzXG4gICAqIGVuYWJsZWQgYW5kIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGl0IHBvaW50cyB0byBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEl0IGNhcmVzIG9ubHkgYWJvdXQgdGhlIGZpcnN0IGF4aXMuIFlvdSBjYW4gc3RpbGwgaGF2ZSBwb3BwZXJzIHdpdGggbWFyZ2luXG4gICAqIGJldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAga2VlcFRvZ2V0aGVyOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTQwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNDAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjoga2VlcFRvZ2V0aGVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgbW9kaWZpZXIgaXMgdXNlZCB0byBtb3ZlIHRoZSBgYXJyb3dFbGVtZW50YCBvZiB0aGUgcG9wcGVyIHRvIG1ha2VcbiAgICogc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBlbGVtZW50IGFuZCBpdHMgcG9wcGVyIGVsZW1lbnQuXG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgb3V0ZXIgc2l6ZSBvZiB0aGUgYGFycm93RWxlbWVudGAgbm9kZSB0byBkZXRlY3QgaG93IG1hbnlcbiAgICogcGl4ZWxzIG9mIGNvbmp1bmN0aW9uIGFyZSBuZWVkZWQuXG4gICAqXG4gICAqIEl0IGhhcyBubyBlZmZlY3QgaWYgbm8gYGFycm93RWxlbWVudGAgaXMgcHJvdmlkZWQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcnJvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj01MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDUwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFycm93LFxuICAgIC8qKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbGVtZW50PSdbeC1hcnJvd10nIC0gU2VsZWN0b3Igb3Igbm9kZSB1c2VkIGFzIGFycm93ICovXG4gICAgZWxlbWVudDogJ1t4LWFycm93XSdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBmbGlwIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQgd2hlbiBpdCBzdGFydHMgdG8gb3ZlcmxhcCBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICpcbiAgICogKipOT1RFOioqIHRoaXMgbW9kaWZpZXIgd2lsbCBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlIGFuZCB3aWxsXG4gICAqIHJlc3RhcnQgaXQgaWYgaXQgZGV0ZWN0cyB0aGUgbmVlZCB0byBmbGlwIHRoZSBwbGFjZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBmbGlwOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTYwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogZmxpcCxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEFycmF5fSBiZWhhdmlvcj0nZmxpcCdcbiAgICAgKiBUaGUgYmVoYXZpb3IgdXNlZCB0byBjaGFuZ2UgdGhlIHBvcHBlcidzIHBsYWNlbWVudC4gSXQgY2FuIGJlIG9uZSBvZlxuICAgICAqIGBmbGlwYCwgYGNsb2Nrd2lzZWAsIGBjb3VudGVyY2xvY2t3aXNlYCBvciBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiB2YWxpZFxuICAgICAqIHBsYWNlbWVudHMgKHdpdGggb3B0aW9uYWwgdmFyaWF0aW9ucylcbiAgICAgKi9cbiAgICBiZWhhdmlvcjogJ2ZsaXAnLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBmbGlwIGlmIGl0IGhpdHMgdGhlIGVkZ2VzIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0ndmlld3BvcnQnXG4gICAgICogVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBkZWZpbmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBvcHBlciBwb3NpdGlvbi5cbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgbmV2ZXIgYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlIGRlZmluZWQgYm91bmRhcmllc1xuICAgICAqIChleGNlcHQgaWYgYGtlZXBUb2dldGhlcmAgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0JyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZmxpcFZhcmlhdGlvbnM9ZmFsc2VcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgc3dpdGNoIHBsYWNlbWVudCB2YXJpYXRpb24gYmV0d2VlbiBgLXN0YXJ0YCBhbmQgYC1lbmRgIHdoZW5cbiAgICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgb3ZlcmxhcHMgaXRzIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uczogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zQnlDb250ZW50PWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHBvcHBlciBlbGVtZW50IG92ZXJsYXBzIGl0cyByZWZlcmVuY2UgYm91bmRhcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYSBzZXQgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIGZsaXBWYXJpYXRpb25zQnlDb250ZW50OiBmYWxzZVxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM0QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogQHByb3Age3N0cmluZ30gW3g9J2JvdHRvbSddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBYIGF4aXMgKGBib3R0b21gIG9yIGB0b3BgKS4gQUtBIFggb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgYm90dG9tYFxuICAgICAqL1xuICAgIHg6ICdib3R0b20nLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdsZWZ0J11cbiAgICAgKiBXaGVyZSB0byBhbmNob3IgdGhlIFkgYXhpcyAoYGxlZnRgIG9yIGByaWdodGApLiBBS0EgWSBvZmZzZXQgb3JpZ2luLlxuICAgICAqIENoYW5nZSB0aGlzIGlmIHlvdXIgcG9wcGVyIHNob3VsZCBncm93IGluIGEgZGlyZWN0aW9uIGRpZmZlcmVudCBmcm9tIGByaWdodGBcbiAgICAgKi9cbiAgICB5OiAncmlnaHQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGNvbXB1dGVkIHN0eWxlcyB0byB0aGUgcG9wcGVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhpcyBtb2RpZmllci4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZVxuICAgKiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgUG9wcGVyLmpzIGluc2lkZSBhIGZyYW1ld29yayBvciB2aWV3IGxpYnJhcnkgYW5kIHlvdVxuICAgKiB3YW50IHRvIGRlbGVnYXRlIGFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgdG8gaXQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBpZiB5b3UgZGlzYWJsZSB0aGlzIG1vZGlmaWVyLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIGhhcyBpdHMgcG9zaXRpb24gc2V0IHRvIGBhYnNvbHV0ZWAgYmVmb3JlIFBvcHBlci5qcyBjYW4gZG8gaXRzIHdvcmshXG4gICAqXG4gICAqIEp1c3QgZGlzYWJsZSB0aGlzIG1vZGlmaWVyIGFuZCBkZWZpbmUgeW91ciBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB1bmRlZmluZWRcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYGRhdGFPYmplY3RgIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSBQb3BwZXIuanMuXG4gKiBUaGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gbW9kaWZpZXJzIGFuZCB0byB0aGUgYG9uQ3JlYXRlYCBhbmQgYG9uVXBkYXRlYCBjYWxsYmFja3MuXG4gKiBAbmFtZSBkYXRhT2JqZWN0XG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5pbnN0YW5jZSBUaGUgUG9wcGVyLmpzIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5wbGFjZW1lbnQgUGxhY2VtZW50IGFwcGxpZWQgdG8gcG9wcGVyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5vcmlnaW5hbFBsYWNlbWVudCBQbGFjZW1lbnQgb3JpZ2luYWxseSBkZWZpbmVkIG9uIGluaXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5mbGlwcGVkIFRydWUgaWYgcG9wcGVyIGhhcyBiZWVuIGZsaXBwZWQgYnkgZmxpcCBtb2RpZmllclxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmhpZGUgVHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kYXJpZXMsIHVzZWZ1bCB0byBrbm93IHdoZW4gdG8gaGlkZSB0aGUgcG9wcGVyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlci4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LiBJdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50c1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5wb3BwZXIgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSBgdG9wYCwgYGxlZnRgLCBgd2lkdGhgLCBgaGVpZ2h0YCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMuYXJyb3ddIGB0b3BgIGFuZCBgbGVmdGAgb2Zmc2V0cywgb25seSBvbmUgb2YgdGhlbSB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIDBcbiAqL1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBwcm92aWRlZCB0byBQb3BwZXIuanMgY29uc3RydWN0b3IuPGJyIC8+XG4gKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgYG9wdGlvbnNgIG9iamVjdCwgYXMgdGhlIDNyZCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50LlxuICAgKiBAcHJvcCB7UG9wcGVyLnBsYWNlbWVudHN9IHBsYWNlbWVudD0nYm90dG9tJ1xuICAgKi9cbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcblxuICAvKipcbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCBwb3BwZXIgdG8gcG9zaXRpb24gaXQgc2VsZiBpbiAnZml4ZWQnIG1vZGVcbiAgICogQHByb3Age0Jvb2xlYW59IHBvc2l0aW9uRml4ZWQ9ZmFsc2VcbiAgICovXG4gIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGV2ZW50cyAocmVzaXplLCBzY3JvbGwpIGFyZSBpbml0aWFsbHkgZW5hYmxlZC5cbiAgICogQHByb3Age0Jvb2xlYW59IGV2ZW50c0VuYWJsZWQ9dHJ1ZVxuICAgKi9cbiAgZXZlbnRzRW5hYmxlZDogdHJ1ZSxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBvcHBlciB3aGVuXG4gICAqIHlvdSBjYWxsIHRoZSBgZGVzdHJveWAgbWV0aG9kLlxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcmVtb3ZlT25EZXN0cm95PWZhbHNlXG4gICAqL1xuICByZW1vdmVPbkRlc3Ryb3k6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGNyZWF0ZWQuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uQ3JlYXRlfVxuICAgKi9cbiAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgdXBkYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkXG4gICAqIG9uIHRoZSBpbml0aWFsaXphdGlvbi9jcmVhdGlvbiBvZiB0aGUgcG9wcGVyLCBidXQgb25seSBvbiBzdWJzZXF1ZW50XG4gICAqIHVwZGF0ZXMuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uVXBkYXRlfVxuICAgKi9cbiAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgbW9kaWZpZXJzIHVzZWQgdG8gbW9kaWZ5IHRoZSBvZmZzZXRzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuXG4gICAqIFRoZXkgcHJvdmlkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgUG9wcGVyLmpzLlxuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvcHBlci5qcyBpbnN0YW5jZS5cbiAgICogQGNsYXNzIFBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR8cmVmZXJlbmNlT2JqZWN0fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgLyBYTUwgZWxlbWVudCB1c2VkIGFzIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiB1cGRhdGUuIEl0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IFVJIHVwZGF0ZSBhdmFpbGFibGUuXG4gICAgICogQG1ldGhvZCBzY2hlZHVsZVVwZGF0ZVxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgdXNlZnVsIHdoZW4gd3JpdGluZyBjdXN0b20gbW9kaWZpZXJzLlxuICAgICAqIFN0YXJ0aW5nIGZyb20gdmVyc2lvbiAxLjcsIHRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHlvdVxuICAgICAqIGluY2x1ZGUgYHBvcHBlci11dGlscy5qc2AgYmVmb3JlIGBwb3BwZXIuanNgLlxuICAgICAqXG4gICAgICogKipERVBSRUNBVElPTioqOiBUaGlzIHdheSB0byBhY2Nlc3MgUG9wcGVyVXRpbHMgaXMgZGVwcmVjYXRlZFxuICAgICAqIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjIhIFVzZSB0aGUgUG9wcGVyVXRpbHMgbW9kdWxlIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICogRHVlIHRvIHRoZSBoaWdoIGluc3RhYmlsaXR5IG9mIHRoZSBtZXRob2RzIGNvbnRhaW5lZCBpbiBVdGlscywgd2UgY2FuJ3RcbiAgICAgKiBndWFyYW50ZWUgdGhlbSB0byBmb2xsb3cgc2VtdmVyLiBVc2UgdGhlbSBhdCB5b3VyIG93biByaXNrIVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjhcbiAgICAgKiBAbWVtYmVyIFV0aWxzXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuXG4gIH1dKTtcbiAgcmV0dXJuIFBvcHBlcjtcbn0oKTtcblxuLyoqXG4gKiBUaGUgYHJlZmVyZW5jZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCBQb3BwZXIuanNcbiAqIGFuZCBsZXRzIHlvdSB1c2UgaXQgYXMgcmVwbGFjZW1lbnQgb2YgYSByZWFsIERPTSBub2RlLjxiciAvPlxuICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcG9zaXRpb24gYSBwb3BwZXIgcmVsYXRpdmVseSB0byBhIHNldCBvZiBjb29yZGluYXRlc1xuICogaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHRvIHVzZSBhcyByZWZlcmVuY2UuXG4gKlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZmVyZW5jZU9iamVjdCwgcG9wcGVyTm9kZSk7XG4gKiBgYGBcbiAqXG4gKiBOQjogVGhpcyBmZWF0dXJlIGlzbid0IHN1cHBvcnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/popper.js/dist/esm/popper.js\n");
     134
     135/***/ }),
     136
     137/***/ "./node_modules/webpack/buildin/global.js":
     138/*!***********************************!*\
     139  !*** (webpack)/buildin/global.js ***!
     140  \***********************************/
     141/*! no static exports found */
     142/***/ (function(module, exports, __webpack_require__) {
     143
     144"use strict";
     145eval("\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar g;\n\n// This works in non-strict mode\ng = function () {\n\treturn this;\n}();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOlsiZyIsIkZ1bmN0aW9uIiwiZSIsIndpbmRvdyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFJQSxDQUFKOztBQUVBO0FBQ0FBLElBQUssWUFBVztBQUNmLFFBQU8sSUFBUDtBQUNBLENBRkcsRUFBSjs7QUFJQSxJQUFJO0FBQ0g7QUFDQUEsS0FBSUEsS0FBSyxJQUFJQyxRQUFKLENBQWEsYUFBYixHQUFUO0FBQ0EsQ0FIRCxDQUdFLE9BQU9DLENBQVAsRUFBVTtBQUNYO0FBQ0EsS0FBSSxRQUFPQyxNQUFQLHlDQUFPQSxNQUFQLE9BQWtCLFFBQXRCLEVBQWdDSCxJQUFJRyxNQUFKO0FBQ2hDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkwsQ0FBakIiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n");
     146
     147/***/ }),
     148
     149/***/ "./scss/shiptimize-admin.scss":
     150/*!************************************!*\
     151  !*** ./scss/shiptimize-admin.scss ***!
     152  \************************************/
     153/*! no static exports found */
     154/***/ (function(module, exports, __webpack_require__) {
     155
     156eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcz82MGM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6Ii4vc2Nzcy9zaGlwdGltaXplLWFkbWluLnNjc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./scss/shiptimize-admin.scss\n");
     157
     158/***/ }),
     159
     160/***/ "./shiptimize-admin.js":
     161/*!*****************************!*\
     162  !*** ./shiptimize-admin.js ***!
     163  \*****************************/
     164/*! no static exports found */
     165/***/ (function(module, exports, __webpack_require__) {
     166
     167"use strict";
     168eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(/*! ./scss/shiptimize-admin.scss */ \"./scss/shiptimize-admin.scss\");\n\nvar _popper = __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\");\n\nvar _popper2 = _interopRequireDefault(_popper);\n\nvar _shiptimizeWooCommerceAdmin = __webpack_require__(/*! ./js/shiptimize-woo-commerce-admin.js */ \"./js/shiptimize-woo-commerce-admin.js\");\n\nvar _shiptimizeWooCommerceAdmin2 = _interopRequireDefault(_shiptimizeWooCommerceAdmin);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Shiptimize = function () {\n  function Shiptimize() {\n    _classCallCheck(this, Shiptimize);\n\n    console.log(\"I'm alive!\");\n  }\n\n  /** \n   *  \n   */\n\n\n  _createClass(Shiptimize, [{\n    key: 'bootstrap',\n    value: function bootstrap() {\n      this.tooltips();\n      this.platform = new _shiptimizeWooCommerceAdmin2.default();\n\n      this.loadAnalytics();\n      if (typeof this.platform.bootstrap != 'undefined') {\n        this.platform.bootstrap();\n      }\n    }\n  }, {\n    key: 'tooltips',\n    value: function tooltips() {\n      var toltip = jQuery(\".shiptimize-tooltip-message\");\n      var container = jQuery('#wpcontent');\n\n      if (toltip.size() == 0) {\n        return;\n      }\n\n      var me = this;\n      toltip.each(function (idx, elem) {\n        me.attachPopper(elem, container);\n      });\n    }\n  }, {\n    key: 'attachPopper',\n    value: function attachPopper(toltip, container) {\n      var eToltip = jQuery(toltip);\n      var toltipReference = eToltip.siblings(\".shiptimize-tooltip-reference\");\n      var arrow = eToltip.children('.shiptimize-tooltip-message__arrow').get(0);\n\n      var popper = new _popper2.default(toltipReference.get(0), toltip, {\n        placement: 'left',\n        modifiers: {\n          flip: {\n            behavior: ['top', 'left', 'bottom']\n          },\n          preventOverflow: {\n            boundariesElement: container\n          },\n          offset: {\n            enabled: true,\n            offset: '10,10'\n          },\n          arrow: {\n            enabled: true,\n            element: arrow\n          }\n        }\n      });\n      setTimeout(function () {\n        popper.update();\n      }, 200);\n    }\n  }, {\n    key: 'exportSuccess',\n    value: function exportSuccess(appLink) {\n      this.platform.exportSuccess(appLink);\n    }\n\n    /** \n     * @param string category \n     * @param string action \n     * @param string label \n     */\n\n  }, {\n    key: 'sendAnalyticsEvent',\n    value: function sendAnalyticsEvent(category, action, label) {\n      ga('shiptimize.send', 'event', category, action, label, { transport: 'beacon' });\n    }\n  }, {\n    key: 'loadAnalytics',\n    value: function loadAnalytics() {\n      if (typeof ga == 'undefined') {\n        (function (i, s, o, g, r, a, m) {\n          i['GoogleAnalyticsObject'] = r;\n          i[r] = i[r] || function () {\n            (i[r].q = i[r].q || []).push(arguments);\n          }, i[r].l = 1 * new Date();\n          a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n          a.async = 1;\n          a.src = g;\n          m.parentNode.insertBefore(a, m);\n        })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n        console.log(\"inserting analytics \");\n      }\n      ga('create', 'UA-101485643-1', 'auto', 'shiptimize');\n      ga('shiptimize.set', 'anonymizeIp', true);\n      console.log(\"creating tracker\");\n    }\n  }, {\n    key: 'printlabel',\n    value: function printlabel(event, orderid) {\n      var _this = this;\n\n      event.stopPropagation();\n      console.log(\"Printing label for orderid \", orderid);\n\n      var data = {\n        'action': 'shiptimize_print_label',\n        'orderid': orderid\n      };\n\n      this.openLoader(shiptimize_label_request);\n\n      jQuery.post(ajaxurl, data, function (data) {\n        console.log(data);\n\n        if (typeof data.response != 'undefined') {\n          if (typeof data.response.Error != 'undefined' && data.response.Error.Id > 0) {\n            _this.loaderMsg(data.response.Error.Info);\n\n            setTimeout(function () {\n              _this.closeLoader();\n            }, 2000);\n          }\n\n          if (typeof data.response.CallbackURL != 'undefined') {\n            _this.monitorLabelStatus(data.response.CallbackURL);\n          }\n        }\n\n        if (typeof data.errors != 'undefined') {\n          _this.loaderMsg(data.errors.join('<br/>'));\n          setTimeout(function () {\n            _this.closeLoader();\n          }, 5000);\n        }\n      }, \"json\");\n    }\n\n    /**\n     * Request the label status every 1s \n     */\n\n  }, {\n    key: 'monitorLabelStatus',\n    value: function monitorLabelStatus(callbackUrl) {\n      var _this2 = this;\n\n      var data = {\n        'action': 'shiptimize_label_status',\n        'callbackUrl': callbackUrl\n      };\n\n      jQuery.post(ajaxurl, data, function (data) {\n        console.log(data);\n\n        if (typeof data.response != 'undefined') {\n\n          // Check for falta errors \n          if (data.httpCode == '200') {\n            _this2.loaderMsg(shiptimize_label_request + ' ' + data.response.Finished + '%');\n          } else {\n            _this2.loaderMsg(\"Fatal API error \" + data.httpCode);\n            setTimeout(function () {\n              _this2.closeLoader();\n            }, 5000);\n            return;\n          }\n\n          // Print API errors\n          if (data.response.Error.Id > 0) {\n            _this2.loaderMsg(data.response.Error.Info);\n          }\n\n          if (data.response.Error.Id == 902) {\n            //No process running \n            setTimeout(function () {\n              _this2.closeLoader();\n            }, 2000);\n          }\n\n          if (data.response.Finished == 100) {\n            if (data.response.LabelFile.length > 0) {\n              var labelinfo = shiptimize_label_click.replace('%', '<a href=\"' + data.response.LabelFile + '\" target=\\'_blank\\'>' + shiptimize_label_label + '</a>');\n              var noticelist = jQuery(\"#wp__notice-list\");\n              noticelist.removeClass('woocommerce-layout__notice-list-hide');\n              noticelist.append('<div class=\"notice notice-info is-dismissible updated\">' + labelinfo + '</div>');\n              window.open(data.response.LabelFile, '_blank');\n              _this2.closeLoader();\n\n              /** \n               * Make sure the info is updated without the need to reload the page \n               */\n              for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n                var labelresult = data.response.ClientReferenceCodeList[x];\n                if (labelresult.Error.Id == 0) {\n                  jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass('shiptimize-icon-print-printed');\n                } else {\n                  jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n                }\n\n                jQuery(\"#shiptimize-tooltip\" + labelresult.ReferenceCode).html(labelresult.message);\n              }\n            } else {\n              var msg = '';\n              for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n                var _labelresult = data.response.ClientReferenceCodeList[0];\n                if (_labelresult.Error.Id > 0) {\n                  msg += \"<div class='shiptimize-label-error error'>\" + _labelresult.Error.Info + \"</div>\";\n                }\n                jQuery(\"#shiptimize-label\" + _labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n                jQuery(\"#shiptimize-tooltip\" + _labelresult.ReferenceCode).html(_labelresult.message);\n              }\n\n              _this2.loaderMsg(msg);\n              setTimeout(function () {\n                _this2.closeLoader();\n              }, 5000);\n            }\n          }\n\n          if (data.response.Finished < 100) {\n            setTimeout(function () {\n              _this2.monitorLabelStatus(callbackUrl);\n            }, 2000);\n          }\n        }\n      }, \"json\");\n    }\n  }, {\n    key: 'loaderMsg',\n    value: function loaderMsg(message) {\n      jQuery(\".shiptimize-loader-message\").html(message);\n    }\n  }, {\n    key: 'openLoader',\n    value: function openLoader(message) {\n      jQuery('body').append('<div class=\"shiptimize-loader-wrapper\"><div class=\"shiptimize-loader\"><div></div><div></div><div></div></div><div class=\"shiptimize-loader-message\">' + message + '</div></div>');\n    }\n  }, {\n    key: 'closeLoader',\n    value: function closeLoader() {\n      jQuery(\".shiptimize-loader-wrapper\").remove();\n    }\n  }]);\n\n  return Shiptimize;\n}();\n\njQuery(function () {\n  window.shiptimize = new Shiptimize();\n  window.shiptimize.bootstrap();\n  window.Popper = _popper2.default;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdGltaXplLWFkbWluLmpzPzM4YTIiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZSIsImNvbnNvbGUiLCJsb2ciLCJ0b29sdGlwcyIsInBsYXRmb3JtIiwiV29vU2hpcHRpbWl6ZSIsImxvYWRBbmFseXRpY3MiLCJib290c3RyYXAiLCJ0b2x0aXAiLCJqUXVlcnkiLCJjb250YWluZXIiLCJzaXplIiwibWUiLCJlYWNoIiwiaWR4IiwiZWxlbSIsImF0dGFjaFBvcHBlciIsImVUb2x0aXAiLCJ0b2x0aXBSZWZlcmVuY2UiLCJzaWJsaW5ncyIsImFycm93IiwiY2hpbGRyZW4iLCJnZXQiLCJwb3BwZXIiLCJQb3BwZXIiLCJwbGFjZW1lbnQiLCJtb2RpZmllcnMiLCJmbGlwIiwiYmVoYXZpb3IiLCJwcmV2ZW50T3ZlcmZsb3ciLCJib3VuZGFyaWVzRWxlbWVudCIsIm9mZnNldCIsImVuYWJsZWQiLCJlbGVtZW50Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsImFwcExpbmsiLCJleHBvcnRTdWNjZXNzIiwiY2F0ZWdvcnkiLCJhY3Rpb24iLCJsYWJlbCIsImdhIiwidHJhbnNwb3J0IiwiaSIsInMiLCJvIiwiZyIsInIiLCJhIiwibSIsInEiLCJwdXNoIiwiYXJndW1lbnRzIiwibCIsIkRhdGUiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImV2ZW50Iiwib3JkZXJpZCIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGEiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwicG9zdCIsImFqYXh1cmwiLCJyZXNwb25zZSIsIkVycm9yIiwiSWQiLCJsb2FkZXJNc2ciLCJJbmZvIiwiY2xvc2VMb2FkZXIiLCJDYWxsYmFja1VSTCIsIm1vbml0b3JMYWJlbFN0YXR1cyIsImVycm9ycyIsImpvaW4iLCJjYWxsYmFja1VybCIsImh0dHBDb2RlIiwiRmluaXNoZWQiLCJMYWJlbEZpbGUiLCJsZW5ndGgiLCJsYWJlbGluZm8iLCJzaGlwdGltaXplX2xhYmVsX2NsaWNrIiwicmVwbGFjZSIsInNoaXB0aW1pemVfbGFiZWxfbGFiZWwiLCJub3RpY2VsaXN0IiwicmVtb3ZlQ2xhc3MiLCJhcHBlbmQiLCJvcGVuIiwieCIsIkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0IiwibGFiZWxyZXN1bHQiLCJSZWZlcmVuY2VDb2RlIiwiYWRkQ2xhc3MiLCJodG1sIiwibWVzc2FnZSIsIm1zZyIsInJlbW92ZSIsInNoaXB0aW1pemUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFDQTs7OztBQUVBOzs7Ozs7OztJQUVNQSxVO0FBRUosd0JBQWE7QUFBQTs7QUFDWEMsWUFBUUMsR0FBUixDQUFZLFlBQVo7QUFDRDs7QUFFRDs7Ozs7OztnQ0FHVztBQUNULFdBQUtDLFFBQUw7QUFDQSxXQUFLQyxRQUFMLEdBQWdCLElBQUlDLG9DQUFKLEVBQWhCOztBQUVBLFdBQUtDLGFBQUw7QUFDQSxVQUFHLE9BQU8sS0FBS0YsUUFBTCxDQUFjRyxTQUFyQixJQUFtQyxXQUF0QyxFQUFtRDtBQUNqRCxhQUFLSCxRQUFMLENBQWNHLFNBQWQ7QUFDRDtBQUNGOzs7K0JBRVU7QUFDVCxVQUFJQyxTQUFTQyxPQUFPLDZCQUFQLENBQWI7QUFDQSxVQUFJQyxZQUFZRCxPQUFPLFlBQVAsQ0FBaEI7O0FBRUEsVUFBS0QsT0FBT0csSUFBUCxNQUFpQixDQUF0QixFQUEwQjtBQUN4QjtBQUNEOztBQUVELFVBQUlDLEtBQUssSUFBVDtBQUNBSixhQUFPSyxJQUFQLENBQWEsVUFBV0MsR0FBWCxFQUFnQkMsSUFBaEIsRUFBdUI7QUFDbENILFdBQUdJLFlBQUgsQ0FBZ0JELElBQWhCLEVBQXFCTCxTQUFyQjtBQUNELE9BRkQ7QUFJRDs7O2lDQUVZRixNLEVBQVFFLFMsRUFBVTtBQUM3QixVQUFJTyxVQUFVUixPQUFPRCxNQUFQLENBQWQ7QUFDQSxVQUFJ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QWY7QUFDQW5FLHlCQUFXLFlBQU07QUFBRSx1QkFBSzBDLFdBQUw7QUFBcUIsZUFBeEMsRUFBMEMsSUFBMUM7QUFDRDtBQUNGOztBQUVELGNBQUdWLEtBQUtLLFFBQUwsQ0FBY1ksUUFBZCxHQUF5QixHQUE1QixFQUFpQztBQUMvQmpELHVCQUFZLFlBQU07QUFBRSxxQkFBSzRDLGtCQUFMLENBQXdCRyxXQUF4QjtBQUF1QyxhQUEzRCxFQUE2RCxJQUE3RDtBQUNEO0FBQ0Y7QUFFRixPQXZFRCxFQXVFRyxNQXZFSDtBQXdFRDs7OzhCQUVTbUIsTyxFQUFTO0FBQ2pCM0YsYUFBTyw0QkFBUCxFQUFxQzBGLElBQXJDLENBQTBDQyxPQUExQztBQUNEOzs7K0JBRVVBLE8sRUFBUztBQUNsQjNGLGFBQU8sTUFBUCxFQUFlbUYsTUFBZixDQUFzQix5SkFBeUpRLE9BQXpKLEdBQW9LLGNBQTFMO0FBQ0Q7OztrQ0FFWTtBQUNYM0YsYUFBTyw0QkFBUCxFQUFxQzZGLE1BQXJDO0FBQ0Q7Ozs7OztBQUdIN0YsT0FBTyxZQUFZO0FBQ2pCb0QsU0FBTzBDLFVBQVAsR0FBb0IsSUFBSXZHLFVBQUosRUFBcEI7QUFDQTZELFNBQU8wQyxVQUFQLENBQWtCaEcsU0FBbEI7QUFDQXNELFNBQU9yQyxNQUFQLEdBQWdCQSxnQkFBaEI7QUFDRCxDQUpEIiwiZmlsZSI6Ii4vc2hpcHRpbWl6ZS1hZG1pbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcyc7XG5pbXBvcnQgUG9wcGVyIGZyb20gJ3BvcHBlci5qcyc7IFxuXG5pbXBvcnQgV29vU2hpcHRpbWl6ZSAgZnJvbSAnLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcyc7IFxuXG5jbGFzcyBTaGlwdGltaXplIHtcblxuICBjb25zdHJ1Y3Rvcigpe1xuICAgIGNvbnNvbGUubG9nKFwiSSdtIGFsaXZlIVwiKTsgXG4gIH1cblxuICAvKiogXG4gICAqICBcbiAgICovIFxuICBib290c3RyYXAoKXtcbiAgICB0aGlzLnRvb2x0aXBzKCk7IFxuICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgV29vU2hpcHRpbWl6ZSgpOyBcblxuICAgIHRoaXMubG9hZEFuYWx5dGljcygpOyBcbiAgICBpZih0eXBlb2YodGhpcy5wbGF0Zm9ybS5ib290c3RyYXApICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnBsYXRmb3JtLmJvb3RzdHJhcCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvb2x0aXBzKCApe1xuICAgIGxldCB0b2x0aXAgPSBqUXVlcnkoXCIuc2hpcHRpbWl6ZS10b29sdGlwLW1lc3NhZ2VcIik7XG4gICAgbGV0IGNvbnRhaW5lciA9IGpRdWVyeSgnI3dwY29udGVudCcpOyBcblxuICAgIGlmICggdG9sdGlwLnNpemUoKSA9PSAwICkge1xuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBsZXQgbWUgPSB0aGlzOyBcbiAgICB0b2x0aXAuZWFjaCggZnVuY3Rpb24gKCBpZHgsIGVsZW0gKSB7XG4gICAgICBtZS5hdHRhY2hQb3BwZXIoZWxlbSxjb250YWluZXIpO1xuICAgIH0pOyAgICAgIFxuXG4gIH1cblxuICBhdHRhY2hQb3BwZXIodG9sdGlwLCBjb250YWluZXIpeyAgXG4gICAgbGV0IGVUb2x0aXAgPSBqUXVlcnkodG9sdGlwKTsgXG4gICAgbGV0IHRvbHRpcFJlZmVyZW5jZSA9IGVUb2x0aXAuc2libGluZ3MoXCIuc2hpcHRpbWl6ZS10b29sdGlwLXJlZmVyZW5jZVwiKTtcbiAgICBsZXQgYXJyb3cgPSBlVG9sdGlwLmNoaWxkcmVuKCcuc2hpcHRpbWl6ZS10b29sdGlwLW1lc3NhZ2VfX2Fycm93JykuZ2V0KDApOyBcblxuICAgIHZhciBwb3BwZXIgPSBuZXcgUG9wcGVyKHRvbHRpcFJlZmVyZW5jZS5nZXQoMCksIHRvbHRpcCwge1xuICAgICAgcGxhY2VtZW50OiAnbGVmdCcsXG4gICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBmbGlwOiB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiBbJ3RvcCcsJ2xlZnQnLCAnYm90dG9tJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogY29udGFpbmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb2Zmc2V0OiB7IFxuICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICBvZmZzZXQ6ICcxMCwxMCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFycm93OiB7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgZWxlbWVudDogYXJyb3dcbiAgICAgICAgICB9XG4gICAgICB9LCBcbiAgICB9KTsgIFxuICAgIHNldFRpbWVvdXQgKCAoKSA9PiB7IHBvcHBlci51cGRhdGUoKTsgfSAsIDIwMCk7ICAgICBcbiAgfVxuXG4gIGV4cG9ydFN1Y2Nlc3MoYXBwTGluayl7XG4gICAgdGhpcy5wbGF0Zm9ybS5leHBvcnRTdWNjZXNzKGFwcExpbmspO1xuICB9XG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gc3RyaW5nIGNhdGVnb3J5IFxuICAgKiBAcGFyYW0gc3RyaW5nIGFjdGlvbiBcbiAgICogQHBhcmFtIHN0cmluZyBsYWJlbCBcbiAgICovXG4gIHNlbmRBbmFseXRpY3NFdmVudChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCkge1xuICAgICAgZ2EoJ3NoaXB0aW1pemUuc2VuZCcsICdldmVudCcsIGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB7IHRyYW5zcG9ydDogJ2JlYWNvbicgfSk7XG4gIH1cblxuICBsb2FkQW5hbHl0aWNzKCkge1xuICAgICAgaWYgKHR5cGVvZihnYSkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAoZnVuY3Rpb24oaSwgcywgbywgZywgciwgYSwgbSkge1xuICAgICAgICAgICAgICBpWydHb29nbGVBbmFseXRpY3NPYmplY3QnXSA9IHI7XG4gICAgICAgICAgICAgIGlbcl0gPSBpW3JdIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgKGlbcl0ucSA9IGlbcl0ucSB8fCBbXSkucHVzaChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIH0sIGlbcl0ubCA9IDEgKiBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICBhID0gcy5jcmVhdGVFbGVtZW50KG8pLFxuICAgICAgICAgICAgICAgICAgbSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07XG4gICAgICAgICAgICAgIGEuYXN5bmMgPSAxO1xuICAgICAgICAgICAgICBhLnNyYyA9IGc7XG4gICAgICAgICAgICAgIG0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSwgbSlcbiAgICAgICAgICB9KSh3aW5kb3csIGRvY3VtZW50LCAnc2NyaXB0JywgJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsICdnYScpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zZXJ0aW5nIGFuYWx5dGljcyBcIik7XG4gICAgICB9IFxuICAgICAgZ2EoJ2NyZWF0ZScsICdVQS0xMDE0ODU2NDMtMScsICdhdXRvJywgJ3NoaXB0aW1pemUnKTtcbiAgICAgIGdhKCdzaGlwdGltaXplLnNldCcsICdhbm9ueW1pemVJcCcsIHRydWUpO1xuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGluZyB0cmFja2VyXCIpO1xuICB9XG5cbiAgcHJpbnRsYWJlbChldmVudCwgb3JkZXJpZCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBcbiAgICBjb25zb2xlLmxvZyAoXCJQcmludGluZyBsYWJlbCBmb3Igb3JkZXJpZCBcIiwgb3JkZXJpZCk7XG5cbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9wcmludF9sYWJlbCcsIFxuICAgICAgJ29yZGVyaWQnOiBvcmRlcmlkXG4gICAgfTsgXG5cbiAgICB0aGlzLm9wZW5Mb2FkZXIoc2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0KTsgXG5cbiAgICBqUXVlcnkucG9zdChhamF4dXJsLCBkYXRhLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZGF0YSk7IFxuXG4gICAgICBpZiAodHlwZW9mKGRhdGEucmVzcG9uc2UpICE9ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgIGlmKHR5cGVvZihkYXRhLnJlc3BvbnNlLkVycm9yKSAhPSAndW5kZWZpbmVkJyAmJiBkYXRhLnJlc3BvbnNlLkVycm9yLklkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5yZXNwb25zZS5FcnJvci5JbmZvKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgMjAwMCk7ICBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih0eXBlb2YoZGF0YS5yZXNwb25zZS5DYWxsYmFja1VSTCkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMubW9uaXRvckxhYmVsU3RhdHVzKGRhdGEucmVzcG9uc2UuQ2FsbGJhY2tVUkwpOyAgICAgICAgICAgICBcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKHR5cGVvZihkYXRhLmVycm9ycykgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5lcnJvcnMuam9pbignPGJyLz4nKSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDUwMDApOyAgXG4gICAgICB9XG4gICAgfSwgXCJqc29uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIGxhYmVsIHN0YXR1cyBldmVyeSAxcyBcbiAgICovXG4gIG1vbml0b3JMYWJlbFN0YXR1cyhjYWxsYmFja1VybCkge1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgJ2FjdGlvbic6ICdzaGlwdGltaXplX2xhYmVsX3N0YXR1cycsXG4gICAgICAnY2FsbGJhY2tVcmwnOiBjYWxsYmFja1VybFxuICAgIH07IFxuXG4gICAgalF1ZXJ5LnBvc3QoYWpheHVybCwgZGF0YSwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGRhdGEpOyBcblxuICAgICAgaWYodHlwZW9mKGRhdGEucmVzcG9uc2UpIT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZmFsdGEgZXJyb3JzIFxuICAgICAgICBpZihkYXRhLmh0dHBDb2RlID09ICcyMDAnKSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coc2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0ICsgJyAnICsgZGF0YS5yZXNwb25zZS5GaW5pc2hlZCArICclJyk7ICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coXCJGYXRhbCBBUEkgZXJyb3IgXCIgKyBkYXRhLmh0dHBDb2RlKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbG9zZUxvYWRlcigpOyB9LCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47IFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbnQgQVBJIGVycm9yc1xuICAgICAgICBpZiAoZGF0YS5yZXNwb25zZS5FcnJvci5JZCA+IDApIHtcbiAgICAgICAgICB0aGlzLmxvYWRlck1zZyhkYXRhLnJlc3BvbnNlLkVycm9yLkluZm8pOyBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRXJyb3IuSWQgPT0gOTAyKSB7IC8vTm8gcHJvY2VzcyBydW5uaW5nIFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGVyKClcbiAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRmluaXNoZWQgPT0gMTAwICkge1xuICAgICAgICAgIGlmICggZGF0YS5yZXNwb25zZS5MYWJlbEZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsaW5mbyA9IHNoaXB0aW1pemVfbGFiZWxfY2xpY2sucmVwbGFjZSgnJScsYDxhIGhyZWY9XCIke2RhdGEucmVzcG9uc2UuTGFiZWxGaWxlfVwiIHRhcmdldD0nX2JsYW5rJz4ke3NoaXB0aW1pemVfbGFiZWxfbGFiZWx9PC9hPmApO1xuICAgICAgICAgICAgbGV0IG5vdGljZWxpc3QgPSBqUXVlcnkoXCIjd3BfX25vdGljZS1saXN0XCIpOyBcbiAgICAgICAgICAgIG5vdGljZWxpc3QucmVtb3ZlQ2xhc3MoJ3dvb2NvbW1lcmNlLWxheW91dF9fbm90aWNlLWxpc3QtaGlkZScpOyBcbiAgICAgICAgICAgIG5vdGljZWxpc3QuYXBwZW5kKGA8ZGl2IGNsYXNzPVwibm90aWNlIG5vdGljZS1pbmZvIGlzLWRpc21pc3NpYmxlIHVwZGF0ZWRcIj4ke2xhYmVsaW5mb308L2Rpdj5gKTtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRhdGEucmVzcG9uc2UuTGFiZWxGaWxlLCdfYmxhbmsnKTsgXG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGVyKCk7XG5cbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIE1ha2Ugc3VyZSB0aGUgaW5mbyBpcyB1cGRhdGVkIHdpdGhvdXQgdGhlIG5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlIFxuICAgICAgICAgICAgICovIFxuICAgICAgICAgICAgZm9yKHZhciB4ID0wOyB4IDwgZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdC5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgICB2YXIgbGFiZWxyZXN1bHQgPSBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0W3hdOyBcbiAgICAgICAgICAgICAgaWYobGFiZWxyZXN1bHQuRXJyb3IuSWQgPT0gMCkgeyBcbiAgICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1sYWJlbFwiICsgbGFiZWxyZXN1bHQuUmVmZXJlbmNlQ29kZSkuYWRkQ2xhc3MoJ3NoaXB0aW1pemUtaWNvbi1wcmludC1wcmludGVkJyk7ICAgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKFwic2hpcHRpbWl6ZS1pY29uLXByaW50LWVycm9yXCIpOyAgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLXRvb2x0aXBcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmh0bWwobGFiZWxyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1zZyA9ICcnOyBcbiAgICAgICAgICAgIGZvciAoIHZhciB4PTA7IHggPCBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0Lmxlbmd0aDsgKyt4ICkge1xuICAgICAgICAgICAgICBsZXQgbGFiZWxyZXN1bHQgPSBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0WzBdOyBcbiAgICAgICAgICAgICAgaWYobGFiZWxyZXN1bHQuRXJyb3IuSWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IFwiPGRpdiBjbGFzcz0nc2hpcHRpbWl6ZS1sYWJlbC1lcnJvciBlcnJvcic+XCIgKyBsYWJlbHJlc3VsdC5FcnJvci5JbmZvICsgXCI8L2Rpdj5cIjsgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKFwic2hpcHRpbWl6ZS1pY29uLXByaW50LWVycm9yXCIpOyAgXG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLXRvb2x0aXBcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmh0bWwobGFiZWxyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGVyTXNnKG1zZyk7IFxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgNTAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoZGF0YS5yZXNwb25zZS5GaW5pc2hlZCA8IDEwMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tb25pdG9yTGFiZWxTdGF0dXMoY2FsbGJhY2tVcmwpOyB9LCAyMDAwKTsgXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0sIFwianNvblwiKTtcbiAgfVxuXG4gIGxvYWRlck1zZyhtZXNzYWdlKSB7XG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtbG9hZGVyLW1lc3NhZ2VcIikuaHRtbChtZXNzYWdlKTsgXG4gIH1cblxuICBvcGVuTG9hZGVyKG1lc3NhZ2UpIHtcbiAgICBqUXVlcnkoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlci13cmFwcGVyXCI+PGRpdiBjbGFzcz1cInNoaXB0aW1pemUtbG9hZGVyXCI+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cInNoaXB0aW1pemUtbG9hZGVyLW1lc3NhZ2VcIj4nICsgbWVzc2FnZSAgKyAnPC9kaXY+PC9kaXY+Jyk7IFxuICB9XG5cbiAgY2xvc2VMb2FkZXIoKXtcbiAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1sb2FkZXItd3JhcHBlclwiKS5yZW1vdmUoKTsgXG4gIH1cbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemUgPSBuZXcgU2hpcHRpbWl6ZSgpO1xuICB3aW5kb3cuc2hpcHRpbWl6ZS5ib290c3RyYXAoKTsgXG4gIHdpbmRvdy5Qb3BwZXIgPSBQb3BwZXI7XG59KTtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./shiptimize-admin.js\n");
     169
     170/***/ })
     171
     172/******/ });
  • shiptimize-for-woocommerce/trunk/assets/js/shiptimize-dokan.js

    r2724326 r2746465  
    1 !function(i){var t={};function r(e){if(t[e])return t[e].exports;var n=t[e]={i:e,l:!1,exports:{}};return i[e].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=i,r.c=t,r.d=function(e,n,i){r.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(n,e){if(1&e&&(n=r(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var t in n)r.d(i,t,function(e){return n[e]}.bind(null,t));return i},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},r.p="/shiptimize-for-woocommerce/assets/js",r(r.s=14)}({14:function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeDokan = function () {\n  function ShiptimizeDokan() {\n    _classCallCheck(this, ShiptimizeDokan);\n  }\n\n  _createClass(ShiptimizeDokan, [{\n    key: "export",\n    value: function _export(data) {\n      jQuery("<div class=\'shiptimize-sending\'>" + shiptimize_label_sending + "</div>").insertBefore(\'.shiptimize-export-btn\');\n      jQuery.ajax({\n        url: dokan.ajaxurl,\n        method: \'GET\',\n        data: data,\n        success: function success(resp) {\n          jQuery(".shiptimize-sending").remove();\n          jQuery(resp).insertAfter(\'.shiptimize-export-btn\');\n        },\n        error: function error(err) {\n          jQuery(".shiptimize-sending").remove();\n          jQuery("An error has occurred " + JSON.stringify(err)).insertAfter(".shiptimize-export-btn");\n        }\n      });\n    }\n  }, {\n    key: "exportSelected",\n    value: function exportSelected() {\n      var selectedIds = [];\n      jQuery("input[name=\'bulk_orders[]\']:checked").each(function (idx, elem) {\n        selectedIds[idx] = jQuery(elem).val();\n      });\n\n      if (selectedIds.length == 0) {\n        alert("No orders are selected");\n        return;\n      }\n      var data = {\n        \'action\': \'shiptimize_dokan_export_selected\',\n        \'ids\': selectedIds\n      };\n\n      this.export(data);\n    }\n  }, {\n    key: "exportAll",\n    value: function exportAll() {\n      var data = {\n        \'action\': \'shiptimize_dokan_export_all\'\n      };\n\n      this.export(data);\n    }\n  }]);\n\n  return ShiptimizeDokan;\n}();\n\njQuery(function () {\n  window.shiptimize_dokan = new ShiptimizeDokan();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWRva2FuLmpzP2FmNDUiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZURva2FuIiwiZGF0YSIsImpRdWVyeSIsInNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyIsImluc2VydEJlZm9yZSIsImFqYXgiLCJ1cmwiLCJkb2thbiIsImFqYXh1cmwiLCJtZXRob2QiLCJzdWNjZXNzIiwicmVzcCIsInJlbW92ZSIsImluc2VydEFmdGVyIiwiZXJyb3IiLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZWN0ZWRJZHMiLCJlYWNoIiwiaWR4IiwiZWxlbSIsInZhbCIsImxlbmd0aCIsImFsZXJ0IiwiZXhwb3J0Iiwid2luZG93Iiwic2hpcHRpbWl6ZV9kb2thbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7OztJQUdNQSxlO0FBRUosNkJBQWM7QUFBQTtBQUFFOzs7OzRCQUVSQyxJLEVBQU07QUFDWkMsYUFBTyxxQ0FBcUNDLHdCQUFyQyxHQUFnRSxRQUF2RSxFQUFpRkMsWUFBakYsQ0FBOEYsd0JBQTlGO0FBQ0FGLGFBQU9HLElBQVAsQ0FBWTtBQUNWQyxhQUFLQyxNQUFNQyxPQUREO0FBRVZDLGdCQUFRLEtBRkU7QUFHVlIsY0FBTUEsSUFISTtBQUlWUyxpQkFBUyxpQkFBVUMsSUFBVixFQUFnQjtBQUN2QlQsaUJBQU8scUJBQVAsRUFBOEJVLE1BQTlCO0FBQ0FWLGlCQUFPUyxJQUFQLEVBQ0dFLFdBREgsQ0FDZSx3QkFEZjtBQUVELFNBUlM7QUFTVkMsZUFBTyxlQUFVQyxHQUFWLEVBQWU7QUFDcEJiLGlCQUFPLHFCQUFQLEVBQThCVSxNQUE5QjtBQUNBVixpQkFBTywyQkFBMkJjLEtBQUtDLFNBQUwsQ0FBZUYsR0FBZixDQUFsQyxFQUNHRixXQURILENBQ2Usd0JBRGY7QUFFRDtBQWJTLE9BQVo7QUFlRDs7O3FDQUVnQjtBQUNmLFVBQUlLLGNBQWMsRUFBbEI7QUFDQWhCLGFBQU8scUNBQVAsRUFDR2lCLElBREgsQ0FDUSxVQUFVQyxHQUFWLEVBQWVDLElBQWYsRUFBcUI7QUFDekJILG9CQUFZRSxHQUFaLElBQW1CbEIsT0FBT21CLElBQVAsRUFDaEJDLEdBRGdCLEVBQW5CO0FBRUQsT0FKSDs7QUFNQSxVQUFJSixZQUFZSyxNQUFaLElBQXNCLENBQTFCLEVBQTZCO0FBQzNCQyxjQUFNLHdCQUFOO0FBQ0E7QUFDRDtBQUNELFVBQUl2QixPQUFPO0FBQ1Qsa0JBQVUsa0NBREQ7QUFFVCxlQUFPaUI7QUFGRSxPQUFYOztBQUtBLFdBQUtPLE1BQUwsQ0FBWXhCLElBQVo7QUFDRDs7O2dDQUVXO0FBQ1YsVUFBSUEsT0FBTztBQUNULGtCQUFVO0FBREQsT0FBWDs7QUFJQSxXQUFLd0IsTUFBTCxDQUFZeEIsSUFBWjtBQUNEOzs7Ozs7QUFJSEMsT0FBTyxZQUFZO0FBQ2pCd0IsU0FBT0MsZ0JBQVAsR0FBMEIsSUFBSTNCLGVBQUosRUFBMUI7QUFDRCxDQUZEIiwiZmlsZSI6IjE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplRG9rYW4ge1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBleHBvcnQgKGRhdGEpIHtcbiAgICBqUXVlcnkoXCI8ZGl2IGNsYXNzPSdzaGlwdGltaXplLXNlbmRpbmcnPlwiICsgc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nICsgXCI8L2Rpdj5cIikuaW5zZXJ0QmVmb3JlKCcuc2hpcHRpbWl6ZS1leHBvcnQtYnRuJyk7XG4gICAgalF1ZXJ5LmFqYXgoe1xuICAgICAgdXJsOiBkb2thbi5hamF4dXJsLFxuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1zZW5kaW5nXCIpLnJlbW92ZSgpO1xuICAgICAgICBqUXVlcnkocmVzcClcbiAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoJy5zaGlwdGltaXplLWV4cG9ydC1idG4nKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1zZW5kaW5nXCIpLnJlbW92ZSgpO1xuICAgICAgICBqUXVlcnkoXCJBbiBlcnJvciBoYXMgb2NjdXJyZWQgXCIgKyBKU09OLnN0cmluZ2lmeShlcnIpKVxuICAgICAgICAgIC5pbnNlcnRBZnRlcihcIi5zaGlwdGltaXplLWV4cG9ydC1idG5cIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRTZWxlY3RlZCgpIHtcbiAgICBsZXQgc2VsZWN0ZWRJZHMgPSBbXTtcbiAgICBqUXVlcnkoXCJpbnB1dFtuYW1lPSdidWxrX29yZGVyc1tdJ106Y2hlY2tlZFwiKVxuICAgICAgLmVhY2goZnVuY3Rpb24gKGlkeCwgZWxlbSkge1xuICAgICAgICBzZWxlY3RlZElkc1tpZHhdID0galF1ZXJ5KGVsZW0pXG4gICAgICAgICAgLnZhbCgpO1xuICAgICAgfSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09IDApIHtcbiAgICAgIGFsZXJ0KFwiTm8gb3JkZXJzIGFyZSBzZWxlY3RlZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfZG9rYW5fZXhwb3J0X3NlbGVjdGVkJyxcbiAgICAgICdpZHMnOiBzZWxlY3RlZElkc1xuICAgIH07XG5cbiAgICB0aGlzLmV4cG9ydChkYXRhKTtcbiAgfVxuXG4gIGV4cG9ydEFsbCgpIHtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9kb2thbl9leHBvcnRfYWxsJ1xuICAgIH07XG5cbiAgICB0aGlzLmV4cG9ydChkYXRhKTtcbiAgfVxufVxuXG5cbmpRdWVyeShmdW5jdGlvbiAoKSB7XG4gIHdpbmRvdy5zaGlwdGltaXplX2Rva2FuID0gbmV3IFNoaXB0aW1pemVEb2thbigpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///14\n')}});
     1/******/ (function(modules) { // webpackBootstrap
     2/******/    // The module cache
     3/******/    var installedModules = {};
     4/******/
     5/******/    // The require function
     6/******/    function __webpack_require__(moduleId) {
     7/******/
     8/******/        // Check if module is in cache
     9/******/        if(installedModules[moduleId]) {
     10/******/            return installedModules[moduleId].exports;
     11/******/        }
     12/******/        // Create a new module (and put it into the cache)
     13/******/        var module = installedModules[moduleId] = {
     14/******/            i: moduleId,
     15/******/            l: false,
     16/******/            exports: {}
     17/******/        };
     18/******/
     19/******/        // Execute the module function
     20/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     21/******/
     22/******/        // Flag the module as loaded
     23/******/        module.l = true;
     24/******/
     25/******/        // Return the exports of the module
     26/******/        return module.exports;
     27/******/    }
     28/******/
     29/******/
     30/******/    // expose the modules object (__webpack_modules__)
     31/******/    __webpack_require__.m = modules;
     32/******/
     33/******/    // expose the module cache
     34/******/    __webpack_require__.c = installedModules;
     35/******/
     36/******/    // define getter function for harmony exports
     37/******/    __webpack_require__.d = function(exports, name, getter) {
     38/******/        if(!__webpack_require__.o(exports, name)) {
     39/******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
     40/******/        }
     41/******/    };
     42/******/
     43/******/    // define __esModule on exports
     44/******/    __webpack_require__.r = function(exports) {
     45/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
     46/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
     47/******/        }
     48/******/        Object.defineProperty(exports, '__esModule', { value: true });
     49/******/    };
     50/******/
     51/******/    // create a fake namespace object
     52/******/    // mode & 1: value is a module id, require it
     53/******/    // mode & 2: merge all properties of value into the ns
     54/******/    // mode & 4: return value when already ns object
     55/******/    // mode & 8|1: behave like require
     56/******/    __webpack_require__.t = function(value, mode) {
     57/******/        if(mode & 1) value = __webpack_require__(value);
     58/******/        if(mode & 8) return value;
     59/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
     60/******/        var ns = Object.create(null);
     61/******/        __webpack_require__.r(ns);
     62/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
     63/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
     64/******/        return ns;
     65/******/    };
     66/******/
     67/******/    // getDefaultExport function for compatibility with non-harmony modules
     68/******/    __webpack_require__.n = function(module) {
     69/******/        var getter = module && module.__esModule ?
     70/******/            function getDefault() { return module['default']; } :
     71/******/            function getModuleExports() { return module; };
     72/******/        __webpack_require__.d(getter, 'a', getter);
     73/******/        return getter;
     74/******/    };
     75/******/
     76/******/    // Object.prototype.hasOwnProperty.call
     77/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
     78/******/
     79/******/    // __webpack_public_path__
     80/******/    __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js";
     81/******/
     82/******/
     83/******/    // Load entry module and return exports
     84/******/    return __webpack_require__(__webpack_require__.s = "./js/shiptimize-dokan.js");
     85/******/ })
     86/************************************************************************/
     87/******/ ({
     88
     89/***/ "./js/shiptimize-dokan.js":
     90/*!********************************!*\
     91  !*** ./js/shiptimize-dokan.js ***!
     92  \********************************/
     93/*! no static exports found */
     94/***/ (function(module, exports, __webpack_require__) {
     95
     96"use strict";
     97eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeDokan = function () {\n  function ShiptimizeDokan() {\n    _classCallCheck(this, ShiptimizeDokan);\n  }\n\n  _createClass(ShiptimizeDokan, [{\n    key: \"export\",\n    value: function _export(data) {\n      jQuery(\"<div class='shiptimize-sending'>\" + shiptimize_label_sending + \"</div>\").insertBefore('.shiptimize-export-btn');\n      jQuery.ajax({\n        url: dokan.ajaxurl,\n        method: 'GET',\n        data: data,\n        success: function success(resp) {\n          jQuery(\".shiptimize-sending\").remove();\n          jQuery(resp).insertAfter('.shiptimize-export-btn');\n        },\n        error: function error(err) {\n          jQuery(\".shiptimize-sending\").remove();\n          jQuery(\"An error has occurred \" + JSON.stringify(err)).insertAfter(\".shiptimize-export-btn\");\n        }\n      });\n    }\n  }, {\n    key: \"exportSelected\",\n    value: function exportSelected() {\n      var selectedIds = [];\n      jQuery(\"input[name='bulk_orders[]']:checked\").each(function (idx, elem) {\n        selectedIds[idx] = jQuery(elem).val();\n      });\n\n      if (selectedIds.length == 0) {\n        alert(\"No orders are selected\");\n        return;\n      }\n      var data = {\n        'action': 'shiptimize_dokan_export_selected',\n        'ids': selectedIds\n      };\n\n      this.export(data);\n    }\n  }, {\n    key: \"exportAll\",\n    value: function exportAll() {\n      var data = {\n        'action': 'shiptimize_dokan_export_all'\n      };\n\n      this.export(data);\n    }\n  }]);\n\n  return ShiptimizeDokan;\n}();\n\njQuery(function () {\n  window.shiptimize_dokan = new ShiptimizeDokan();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWRva2FuLmpzP2FmNDUiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZURva2FuIiwiZGF0YSIsImpRdWVyeSIsInNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyIsImluc2VydEJlZm9yZSIsImFqYXgiLCJ1cmwiLCJkb2thbiIsImFqYXh1cmwiLCJtZXRob2QiLCJzdWNjZXNzIiwicmVzcCIsInJlbW92ZSIsImluc2VydEFmdGVyIiwiZXJyb3IiLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZWN0ZWRJZHMiLCJlYWNoIiwiaWR4IiwiZWxlbSIsInZhbCIsImxlbmd0aCIsImFsZXJ0IiwiZXhwb3J0Iiwid2luZG93Iiwic2hpcHRpbWl6ZV9kb2thbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7OztJQUdNQSxlO0FBRUosNkJBQWM7QUFBQTtBQUFFOzs7OzRCQUVSQyxJLEVBQU07QUFDWkMsYUFBTyxxQ0FBcUNDLHdCQUFyQyxHQUFnRSxRQUF2RSxFQUFpRkMsWUFBakYsQ0FBOEYsd0JBQTlGO0FBQ0FGLGFBQU9HLElBQVAsQ0FBWTtBQUNWQyxhQUFLQyxNQUFNQyxPQUREO0FBRVZDLGdCQUFRLEtBRkU7QUFHVlIsY0FBTUEsSUFISTtBQUlWUyxpQkFBUyxpQkFBVUMsSUFBVixFQUFnQjtBQUN2QlQsaUJBQU8scUJBQVAsRUFBOEJVLE1BQTlCO0FBQ0FWLGlCQUFPUyxJQUFQLEVBQ0dFLFdBREgsQ0FDZSx3QkFEZjtBQUVELFNBUlM7QUFTVkMsZUFBTyxlQUFVQyxHQUFWLEVBQWU7QUFDcEJiLGlCQUFPLHFCQUFQLEVBQThCVSxNQUE5QjtBQUNBVixpQkFBTywyQkFBMkJjLEtBQUtDLFNBQUwsQ0FBZUYsR0FBZixDQUFsQyxFQUNHRixXQURILENBQ2Usd0JBRGY7QUFFRDtBQWJTLE9BQVo7QUFlRDs7O3FDQUVnQjtBQUNmLFVBQUlLLGNBQWMsRUFBbEI7QUFDQWhCLGFBQU8scUNBQVAsRUFDR2lCLElBREgsQ0FDUSxVQUFVQyxHQUFWLEVBQWVDLElBQWYsRUFBcUI7QUFDekJILG9CQUFZRSxHQUFaLElBQW1CbEIsT0FBT21CLElBQVAsRUFDaEJDLEdBRGdCLEVBQW5CO0FBRUQsT0FKSDs7QUFNQSxVQUFJSixZQUFZSyxNQUFaLElBQXNCLENBQTFCLEVBQTZCO0FBQzNCQyxjQUFNLHdCQUFOO0FBQ0E7QUFDRDtBQUNELFVBQUl2QixPQUFPO0FBQ1Qsa0JBQVUsa0NBREQ7QUFFVCxlQUFPaUI7QUFGRSxPQUFYOztBQUtBLFdBQUtPLE1BQUwsQ0FBWXhCLElBQVo7QUFDRDs7O2dDQUVXO0FBQ1YsVUFBSUEsT0FBTztBQUNULGtCQUFVO0FBREQsT0FBWDs7QUFJQSxXQUFLd0IsTUFBTCxDQUFZeEIsSUFBWjtBQUNEOzs7Ozs7QUFJSEMsT0FBTyxZQUFZO0FBQ2pCd0IsU0FBT0MsZ0JBQVAsR0FBMEIsSUFBSTNCLGVBQUosRUFBMUI7QUFDRCxDQUZEIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS1kb2thbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIEFkZCBhbnkgYWRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgd2UgbmVlZCBpbiB0aGUgdmVuZG9yIGRhc2hib2FyZCBcbiAqL1xuY2xhc3MgU2hpcHRpbWl6ZURva2FuIHtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZXhwb3J0IChkYXRhKSB7XG4gICAgalF1ZXJ5KFwiPGRpdiBjbGFzcz0nc2hpcHRpbWl6ZS1zZW5kaW5nJz5cIiArIHNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyArIFwiPC9kaXY+XCIpLmluc2VydEJlZm9yZSgnLnNoaXB0aW1pemUtZXhwb3J0LWJ0bicpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgIHVybDogZG9rYW4uYWpheHVybCxcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtc2VuZGluZ1wiKS5yZW1vdmUoKTtcbiAgICAgICAgalF1ZXJ5KHJlc3ApXG4gICAgICAgICAgLmluc2VydEFmdGVyKCcuc2hpcHRpbWl6ZS1leHBvcnQtYnRuJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtc2VuZGluZ1wiKS5yZW1vdmUoKTtcbiAgICAgICAgalF1ZXJ5KFwiQW4gZXJyb3IgaGFzIG9jY3VycmVkIFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyKSlcbiAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoXCIuc2hpcHRpbWl6ZS1leHBvcnQtYnRuXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0U2VsZWN0ZWQoKSB7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gW107XG4gICAgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nYnVsa19vcmRlcnNbXSddOmNoZWNrZWRcIilcbiAgICAgIC5lYWNoKGZ1bmN0aW9uIChpZHgsIGVsZW0pIHtcbiAgICAgICAgc2VsZWN0ZWRJZHNbaWR4XSA9IGpRdWVyeShlbGVtKVxuICAgICAgICAgIC52YWwoKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBhbGVydChcIk5vIG9yZGVycyBhcmUgc2VsZWN0ZWRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkYXRhID0ge1xuICAgICAgJ2FjdGlvbic6ICdzaGlwdGltaXplX2Rva2FuX2V4cG9ydF9zZWxlY3RlZCcsXG4gICAgICAnaWRzJzogc2VsZWN0ZWRJZHNcbiAgICB9O1xuXG4gICAgdGhpcy5leHBvcnQoZGF0YSk7XG4gIH1cblxuICBleHBvcnRBbGwoKSB7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfZG9rYW5fZXhwb3J0X2FsbCdcbiAgICB9O1xuXG4gICAgdGhpcy5leHBvcnQoZGF0YSk7XG4gIH1cbn1cblxuXG5qUXVlcnkoZnVuY3Rpb24gKCkge1xuICB3aW5kb3cuc2hpcHRpbWl6ZV9kb2thbiA9IG5ldyBTaGlwdGltaXplRG9rYW4oKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-dokan.js\n");
     98
     99/***/ })
     100
     101/******/ });
  • shiptimize-for-woocommerce/trunk/assets/js/shiptimize-wcfm.js

    r2724326 r2746465  
    1 !function(e){var B={};function F(Q){if(B[Q])return B[Q].exports;var i=B[Q]={i:Q,l:!1,exports:{}};return e[Q].call(i.exports,i,i.exports,F),i.l=!0,i.exports}F.m=e,F.c=B,F.d=function(Q,i,e){F.o(Q,i)||Object.defineProperty(Q,i,{enumerable:!0,get:e})},F.r=function(Q){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(Q,"__esModule",{value:!0})},F.t=function(i,Q){if(1&Q&&(i=F(i)),8&Q)return i;if(4&Q&&"object"==typeof i&&i&&i.__esModule)return i;var e=Object.create(null);if(F.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:i}),2&Q&&"string"!=typeof i)for(var B in i)F.d(e,B,function(Q){return i[Q]}.bind(null,B));return e},F.n=function(Q){var i=Q&&Q.__esModule?function(){return Q.default}:function(){return Q};return F.d(i,"a",i),i},F.o=function(Q,i){return Object.prototype.hasOwnProperty.call(Q,i)},F.p="/shiptimize-for-woocommerce/assets/js",F(F.s=13)}({13:function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeWCFM = function () {\n  function ShiptimizeWCFM() {\n    var _this = this;\n\n    _classCallCheck(this, ShiptimizeWCFM);\n\n    /** \n     * Because wcfm will first build the structure for the rules and only then set hte values \n     */\n    this.shipping_methods = ['wcfmmp_shipping_rates_by_weight', 'wcfmmp_shipping_rates'];\n\n    if (jQuery(\"#enable_store_shipping\").size() > 0) {\n      this.appendSelectors();\n    }\n\n    /** \n     * On save if keys are set then check if they produced a valid token \n     */\n    jQuery(\"#wcfm_settings_save_button\").on('click', function (evt) {\n      if (jQuery(\"input[name='shiptimize_public_key']\").val() && jQuery(\"input[name='shiptimize_private_key']\").val()) {\n        setTimeout(function () {\n          _this.checkIfKeysAreValid();\n        }, 500);\n      }\n    });\n  }\n\n  _createClass(ShiptimizeWCFM, [{\n    key: 'appendSelectors',\n    value: function appendSelectors() {\n      var _this2 = this;\n\n      var eCarrierOption = jQuery(\"<div><p class='wcfm_title'><strong>Shiptimize</strong></p></div>\");\n      var eCarriers = jQuery(\"<select class='wcfm-select shiptimize_carrier'><option>-</option>\");\n\n      for (var x = 0; x < shiptimize_carriers.length; ++x) {\n        eCarriers.append(\"<option value='\" + shiptimize_carriers[x].Id + \"'>\" + shiptimize_carriers[x].Name + \"</option>\");\n      }\n\n      eCarrierOption.append(eCarriers);\n\n      for (var x = 0; x < this.shipping_methods.length; ++x) {\n        this.appendShiptimizeTo(this.shipping_methods[x], eCarrierOption);\n      }\n\n      setTimeout(function () {\n        _this2.setSelectedCarrier();\n      }, 1000);\n    }\n  }, {\n    key: 'checkIfKeysAreValid',\n    value: function checkIfKeysAreValid() {\n      var data = { 'action': 'shiptimize_check_keys' };\n      jQuery.getJSON(ajaxurl, data, function (resp) {\n        if (resp.err) {\n          alert(resp.err);\n        }\n        console.log(resp);\n      });\n    }\n\n    /** \n     * \n     */\n\n  }, {\n    key: 'setSelectedCarrier',\n    value: function setSelectedCarrier() {\n      for (var x = 0; x < this.shipping_methods.length; ++x) {\n        var rule_name = 'shiptimize_' + this.shipping_methods[x];\n        var rules = window[rule_name];\n        var elem = jQuery(\"#\" + this.shipping_methods[x]).find('.shiptimize_carrier');\n        console.log(\"settting rules for \" + rule_name, rules);\n        if (typeof rules != 'undefined') {\n          for (var i = 0; i < rules.length; ++i) {\n            jQuery(elem.get(i)).val(rules[i]);\n          }\n        }\n      }\n    }\n\n    /** \n     * @param string - selector - The name of the selector \n     * @param element - eCarrierOption - a template for the carrier select \n     */\n\n  }, {\n    key: 'appendShiptimizeTo',\n    value: function appendShiptimizeTo(selector, eCarrierOption) {\n      var _this3 = this;\n\n      var elem = jQuery(\"#\" + selector).find('.country_select');\n      if (elem.size() == 0) {\n        setTimeout(function () {\n          _this3.appendShiptimizeTo(selector, eCarrierOption);\n        }, 500);\n        return;\n      }\n\n      var eSelect = eCarrierOption.find(\"select\");\n      console.log(eSelect);\n      eSelect.attr(\"name\", \"shiptimize_\" + selector + \"[]\");\n\n      eCarrierOption.clone().insertAfter(elem);\n    }\n  }, {\n    key: 'exportOrder',\n    value: function exportOrder(orderid) {\n      jQuery(\".notice\").remove();\n      jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n      jQuery.ajax({\n        'url': wcfm_params.ajax_url,\n        'type': 'GET',\n        'data': {\n          'action': 'shiptimize_wcfm_export_order',\n          'orderid': orderid\n        },\n        'success': function success(resp) {\n          console.log(resp);\n          jQuery(\"#shiptimize-export-status\").html(\"\");\n          jQuery(\".wcfm-top-element-container\").append(resp);\n        },\n        'error': function error(err) {\n          jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n          console.log(\"Error exporting \" + orderid, err);\n        }\n      });\n    }\n  }, {\n    key: 'exportSelectedOrders',\n    value: function exportSelectedOrders() {\n      jQuery(\".notice\").remove();\n      jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n      var orderids = [];\n      jQuery(\".shiptimize-wcfm-checkbox\").each(function (idx, elem) {\n        if (jQuery(this).is(\":checked\")) {\n          orderids.push(jQuery(this).val());\n        }\n      });\n\n      console.log(\"exporting \", orderids);\n      if (orderids.length == 0) {\n        alert(\"No orders where selected\");\n        return;\n      }\n\n      jQuery.ajax({\n        'url': wcfm_params.ajax_url,\n        'type': 'GET',\n        'data': {\n          'action': 'shiptimize_wcfm_export_orders',\n          'orderids': orderids\n        },\n        'success': function success(resp) {\n          console.log(resp);\n          jQuery(\"#shiptimize-export-status\").html(\"\");\n          jQuery(\".wcfm-top-element-container\").append(resp);\n        },\n        'error': function error(err) {\n          jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n          console.log(\"Error exporting \" + orderids, err);\n        }\n      });\n    }\n  }]);\n\n  return ShiptimizeWCFM;\n}();\n\njQuery(function () {\n  window.shiptimize_wcfm = new ShiptimizeWCFM();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdjZm0uanM/ZDJlZSJdLCJuYW1lcyI6WyJTaGlwdGltaXplV0NGTSIsInNoaXBwaW5nX21ldGhvZHMiLCJqUXVlcnkiLCJzaXplIiwiYXBwZW5kU2VsZWN0b3JzIiwib24iLCJldnQiLCJ2YWwiLCJzZXRUaW1lb3V0IiwiY2hlY2tJZktleXNBcmVWYWxpZCIsImVDYXJyaWVyT3B0aW9uIiwiZUNhcnJpZXJzIiwieCIsInNoaXB0aW1pemVfY2FycmllcnMiLCJsZW5ndGgiLCJhcHBlbmQiLCJJZCIsIk5hbWUiLCJhcHBlbmRTaGlwdGltaXplVG8iLCJzZXRTZWxlY3RlZENhcnJpZXIiLCJkYXRhIiwiZ2V0SlNPTiIsImFqYXh1cmwiLCJyZXNwIiwiZXJyIiwiYWxlcnQiLCJjb25zb2xlIiwibG9nIiwicnVsZV9uYW1lIiwicnVsZXMiLCJ3aW5kb3ciLCJlbGVtIiwiZmluZCIsImkiLCJnZXQiLCJzZWxlY3RvciIsImVTZWxlY3QiLCJhdHRyIiwiY2xvbmUiLCJpbnNlcnRBZnRlciIsIm9yZGVyaWQiLCJyZW1vdmUiLCJodG1sIiwic2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nIiwiYWpheCIsIndjZm1fcGFyYW1zIiwiYWpheF91cmwiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JkZXJpZHMiLCJlYWNoIiwiaWR4IiwiaXMiLCJwdXNoIiwic2hpcHRpbWl6ZV93Y2ZtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0lBR01BLGM7QUFFSiw0QkFBYztBQUFBOztBQUFBOztBQUNaOzs7QUFHQSxTQUFLQyxnQkFBTCxHQUF3QixDQUN0QixpQ0FEc0IsRUFFdEIsdUJBRnNCLENBQXhCOztBQUtBLFFBQUlDLE9BQU8sd0JBQVAsRUFDREMsSUFEQyxLQUNRLENBRFosRUFDZTtBQUNiLFdBQUtDLGVBQUw7QUFDRDs7QUFHRDs7O0FBR0FGLFdBQU8sNEJBQVAsRUFBcUNHLEVBQXJDLENBQXdDLE9BQXhDLEVBQWlELFVBQUND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SUFBUCxFQUFhSyxHQUFiLEVBQWQ7QUFDRDtBQUNGLE9BSkQ7O0FBTUFtQixjQUFRQyxHQUFSLENBQVksWUFBWixFQUEyQnNCLFFBQTNCO0FBQ0EsVUFBSUEsU0FBU25DLE1BQVQsSUFBbUIsQ0FBdkIsRUFBMEI7QUFDeEJXLGNBQU0sMEJBQU47QUFDQTtBQUNEOztBQUVEdkIsYUFBTzBDLElBQVAsQ0FBWTtBQUNWLGVBQU9DLFlBQVlDLFFBRFQ7QUFFVixnQkFBUSxLQUZFO0FBR1YsZ0JBQVE7QUFDTixvQkFBVSwrQkFESjtBQUVOLHNCQUFhRztBQUZQLFNBSEU7QUFPVixtQkFBWSxpQkFBVTFCLElBQVYsRUFBZ0I7QUFDMUJHLGtCQUFRQyxHQUFSLENBQVlKLElBQVo7QUFDQXJCLGlCQUFPLDJCQUFQLEVBQW9Dd0MsSUFBcEMsQ0FBeUMsRUFBekM7QUFDQXhDLGlCQUFPLDZCQUFQLEVBQXNDYSxNQUF0QyxDQUE2Q1EsSUFBN0M7QUFDRCxTQVhTO0FBWVYsaUJBQVUsZUFBVUMsR0FBVixFQUFlO0FBQ3ZCdEIsaUJBQU8sMkJBQVAsRUFBb0N3QyxJQUFwQyxDQUF5Q0ssS0FBS0MsU0FBTCxDQUFleEIsR0FBZixDQUF6QztBQUNBRSxrQkFBUUMsR0FBUixDQUFZLHFCQUFxQnNCLFFBQWpDLEVBQTJDekIsR0FBM0M7QUFDRDtBQWZTLE9BQVo7QUFpQkQ7Ozs7OztBQUdIdEIsT0FBTyxZQUFZO0FBQ2pCNEIsU0FBT3dCLGVBQVAsR0FBeUIsSUFBSXRELGNBQUosRUFBekI7QUFDRCxDQUZEIiwiZmlsZSI6IjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplV0NGTSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIFxuICAgICAqIEJlY2F1c2Ugd2NmbSB3aWxsIGZpcnN0IGJ1aWxkIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBydWxlcyBhbmQgb25seSB0aGVuIHNldCBodGUgdmFsdWVzIFxuICAgICAqL1xuICAgIHRoaXMuc2hpcHBpbmdfbWV0aG9kcyA9IFtcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXNfYnlfd2VpZ2h0JyxcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXMnXG4gICAgXTtcblxuICAgIGlmIChqUXVlcnkoXCIjZW5hYmxlX3N0b3JlX3NoaXBwaW5nXCIpXG4gICAgICAuc2l6ZSgpID4gMCkge1xuICAgICAgdGhpcy5hcHBlbmRTZWxlY3RvcnMoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBPbiBzYXZlIGlmIGtleXMgYXJlIHNldCB0aGVuIGNoZWNrIGlmIHRoZXkgcHJvZHVjZWQgYSB2YWxpZCB0b2tlbiBcbiAgICAgKi8gXG4gICAgalF1ZXJ5KFwiI3djZm1fc2V0dGluZ3Nfc2F2ZV9idXR0b25cIikub24oJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgaWYoalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wdWJsaWNfa2V5J11cIikudmFsKCkgJiYgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wcml2YXRlX2tleSddXCIpLnZhbCgpKXtcbiAgICAgICAgc2V0VGltZW91dCggKCkgPT57IHRoaXMuY2hlY2tJZktleXNBcmVWYWxpZCgpOyB9LCA1MDAgKTsgXG4gICAgICB9XG4gICAgfSk7IFxuICB9XG5cbiAgYXBwZW5kU2VsZWN0b3JzKCkge1xuXG4gICAgdmFyIGVDYXJyaWVyT3B0aW9uID0galF1ZXJ5KFwiPGRpdj48cCBjbGFzcz0nd2NmbV90aXRsZSc+PHN0cm9uZz5TaGlwdGltaXplPC9zdHJvbmc+PC9wPjwvZGl2PlwiKTtcbiAgICB2YXIgZUNhcnJpZXJzID0galF1ZXJ5KFwiPHNlbGVjdCBjbGFzcz0nd2NmbS1zZWxlY3Qgc2hpcHRpbWl6ZV9jYXJyaWVyJz48b3B0aW9uPi08L29wdGlvbj5cIik7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3gpIHtcbiAgICAgIGVDYXJyaWVycy5hcHBlbmQoXCI8b3B0aW9uIHZhbHVlPSdcIiArIHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgKyBcIic+XCIgKyBzaGlwdGltaXplX2NhcnJpZXJzW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiKTtcbiAgICB9XG5cbiAgICBlQ2Fycmllck9wdGlvbi5hcHBlbmQoZUNhcnJpZXJzKTtcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5zaGlwcGluZ19tZXRob2RzLmxlbmd0aDsgKyt4KSB7XG4gICAgICB0aGlzLmFwcGVuZFNoaXB0aW1pemVUbyh0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF0sIGVDYXJyaWVyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDYXJyaWVyKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBjaGVja0lmS2V5c0FyZVZhbGlkKCl7XG4gICAgY29uc3QgZGF0YSA9IHsnYWN0aW9uJzonc2hpcHRpbWl6ZV9jaGVja19rZXlzJ307XG4gICAgalF1ZXJ5LmdldEpTT04oYWpheHVybCwgZGF0YSwgZnVuY3Rpb24ocmVzcCl7XG4gICAgICBpZihyZXNwLmVycil7XG4gICAgICAgIGFsZXJ0KHJlc3AuZXJyKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFxuICAgKiBcbiAgICovXG4gIHNldFNlbGVjdGVkQ2FycmllcigpIHtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuc2hpcHBpbmdfbWV0aG9kcy5sZW5ndGg7ICsreCkge1xuICAgICAgbGV0IHJ1bGVfbmFtZSA9ICdzaGlwdGltaXplXycgKyB0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF07XG4gICAgICBsZXQgcnVsZXMgPSB3aW5kb3dbcnVsZV9uYW1lXTtcbiAgICAgIGxldCBlbGVtID0galF1ZXJ5KFwiI1wiICsgdGhpcy5zaGlwcGluZ19tZXRob2RzW3hdKVxuICAgICAgLmZpbmQoJy5zaGlwdGltaXplX2NhcnJpZXInKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2V0dHRpbmcgcnVsZXMgZm9yIFwiICsgcnVsZV9uYW1lLCBydWxlcyk7XG4gICAgICBpZih0eXBlb2YocnVsZXMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgalF1ZXJ5KGVsZW0uZ2V0KGkpKS52YWwocnVsZXNbaV0pOyBcbiAgICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9XG4gIH1cblxuICAvKiogXG4gICAqIEBwYXJhbSBzdHJpbmcgLSBzZWxlY3RvciAtIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBlQ2Fycmllck9wdGlvbiAtIGEgdGVtcGxhdGUgZm9yIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICovXG4gIGFwcGVuZFNoaXB0aW1pemVUbyhzZWxlY3RvciwgZUNhcnJpZXJPcHRpb24pIHtcbiAgICBsZXQgZWxlbSA9IGpRdWVyeShcIiNcIiArIHNlbGVjdG9yKVxuICAgICAgLmZpbmQoJy5jb3VudHJ5X3NlbGVjdCcpO1xuICAgIGlmIChlbGVtLnNpemUoKSA9PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBlbmRTaGlwdGltaXplVG8oc2VsZWN0b3IsIGVDYXJyaWVyT3B0aW9uKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICB2YXIgZVNlbGVjdCA9IGVDYXJyaWVyT3B0aW9uLmZpbmQoXCJzZWxlY3RcIik7XG4gICAgY29uc29sZS5sb2coZVNlbGVjdCk7XG4gICAgZVNlbGVjdC5hdHRyKFwibmFtZVwiLCBcInNoaXB0aW1pemVfXCIgKyBzZWxlY3RvciArIFwiW11cIik7XG5cbiAgICBlQ2Fycmllck9wdGlvbi5jbG9uZSgpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoZWxlbSk7XG4gIH1cblxuICBleHBvcnRPcmRlcihvcmRlcmlkKXtcbiAgICBqUXVlcnkoXCIubm90aWNlXCIpLnJlbW92ZSgpO1xuICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChzaGlwdGltaXplX2xhYmVsX3NlbmRpbmcpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgICd1cmwnOiB3Y2ZtX3BhcmFtcy5hamF4X3VybCxcbiAgICAgICd0eXBlJzogJ0dFVCcsIFxuICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93Y2ZtX2V4cG9ydF9vcmRlcicsXG4gICAgICAgICdvcmRlcmlkJyA6IG9yZGVyaWQsXG4gICAgICB9LFxuICAgICAgJ3N1Y2Nlc3MnIDogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzcCk7IFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoXCJcIik7XG4gICAgICAgIGpRdWVyeShcIi53Y2ZtLXRvcC1lbGVtZW50LWNvbnRhaW5lclwiKS5hcHBlbmQocmVzcCk7XG4gICAgICB9LFxuICAgICAgJ2Vycm9yJyA6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGV4cG9ydGluZyBcIiArIG9yZGVyaWQsIGVycik7IFxuICAgICAgfVxuICAgIH0pOyBcbiAgfVxuXG4gIGV4cG9ydFNlbGVjdGVkT3JkZXJzKCl7XG4gICAgalF1ZXJ5KFwiLm5vdGljZVwiKS5yZW1vdmUoKTtcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nKTtcbiAgICB2YXIgb3JkZXJpZHMgPSBbXTsgXG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtd2NmbS1jaGVja2JveFwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsZWxlbSkge1xuICAgICAgaWYgKGpRdWVyeSh0aGlzKS5pcyhcIjpjaGVja2VkXCIpKSB7XG4gICAgICAgIG9yZGVyaWRzLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTsgXG4gICAgICB9XG4gICAgfSk7IFxuXG4gICAgY29uc29sZS5sb2coXCJleHBvcnRpbmcgXCIgLCBvcmRlcmlkcyk7IFxuICAgIGlmIChvcmRlcmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgYWxlcnQoXCJObyBvcmRlcnMgd2hlcmUgc2VsZWN0ZWRcIik7IFxuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBqUXVlcnkuYWpheCh7XG4gICAgICAndXJsJzogd2NmbV9wYXJhbXMuYWpheF91cmwsXG4gICAgICAndHlwZSc6ICdHRVQnLCBcbiAgICAgICdkYXRhJzoge1xuICAgICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2NmbV9leHBvcnRfb3JkZXJzJyxcbiAgICAgICAgJ29yZGVyaWRzJyA6IG9yZGVyaWRzLFxuICAgICAgfSxcbiAgICAgICdzdWNjZXNzJyA6IGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3ApOyBcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKFwiXCIpO1xuICAgICAgICBqUXVlcnkoXCIud2NmbS10b3AtZWxlbWVudC1jb250YWluZXJcIikuYXBwZW5kKHJlc3ApO1xuICAgICAgfSxcbiAgICAgICdlcnJvcicgOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBleHBvcnRpbmcgXCIgKyBvcmRlcmlkcywgZXJyKTsgXG4gICAgICB9XG4gICAgfSk7ICBcbiAgfSBcbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemVfd2NmbSA9IG5ldyBTaGlwdGltaXplV0NGTSgpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///13\n")}});
     1/******/ (function(modules) { // webpackBootstrap
     2/******/    // The module cache
     3/******/    var installedModules = {};
     4/******/
     5/******/    // The require function
     6/******/    function __webpack_require__(moduleId) {
     7/******/
     8/******/        // Check if module is in cache
     9/******/        if(installedModules[moduleId]) {
     10/******/            return installedModules[moduleId].exports;
     11/******/        }
     12/******/        // Create a new module (and put it into the cache)
     13/******/        var module = installedModules[moduleId] = {
     14/******/            i: moduleId,
     15/******/            l: false,
     16/******/            exports: {}
     17/******/        };
     18/******/
     19/******/        // Execute the module function
     20/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     21/******/
     22/******/        // Flag the module as loaded
     23/******/        module.l = true;
     24/******/
     25/******/        // Return the exports of the module
     26/******/        return module.exports;
     27/******/    }
     28/******/
     29/******/
     30/******/    // expose the modules object (__webpack_modules__)
     31/******/    __webpack_require__.m = modules;
     32/******/
     33/******/    // expose the module cache
     34/******/    __webpack_require__.c = installedModules;
     35/******/
     36/******/    // define getter function for harmony exports
     37/******/    __webpack_require__.d = function(exports, name, getter) {
     38/******/        if(!__webpack_require__.o(exports, name)) {
     39/******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
     40/******/        }
     41/******/    };
     42/******/
     43/******/    // define __esModule on exports
     44/******/    __webpack_require__.r = function(exports) {
     45/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
     46/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
     47/******/        }
     48/******/        Object.defineProperty(exports, '__esModule', { value: true });
     49/******/    };
     50/******/
     51/******/    // create a fake namespace object
     52/******/    // mode & 1: value is a module id, require it
     53/******/    // mode & 2: merge all properties of value into the ns
     54/******/    // mode & 4: return value when already ns object
     55/******/    // mode & 8|1: behave like require
     56/******/    __webpack_require__.t = function(value, mode) {
     57/******/        if(mode & 1) value = __webpack_require__(value);
     58/******/        if(mode & 8) return value;
     59/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
     60/******/        var ns = Object.create(null);
     61/******/        __webpack_require__.r(ns);
     62/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
     63/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
     64/******/        return ns;
     65/******/    };
     66/******/
     67/******/    // getDefaultExport function for compatibility with non-harmony modules
     68/******/    __webpack_require__.n = function(module) {
     69/******/        var getter = module && module.__esModule ?
     70/******/            function getDefault() { return module['default']; } :
     71/******/            function getModuleExports() { return module; };
     72/******/        __webpack_require__.d(getter, 'a', getter);
     73/******/        return getter;
     74/******/    };
     75/******/
     76/******/    // Object.prototype.hasOwnProperty.call
     77/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
     78/******/
     79/******/    // __webpack_public_path__
     80/******/    __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js";
     81/******/
     82/******/
     83/******/    // Load entry module and return exports
     84/******/    return __webpack_require__(__webpack_require__.s = "./js/shiptimize-wcfm.js");
     85/******/ })
     86/************************************************************************/
     87/******/ ({
     88
     89/***/ "./js/shiptimize-wcfm.js":
     90/*!*******************************!*\
     91  !*** ./js/shiptimize-wcfm.js ***!
     92  \*******************************/
     93/*! no static exports found */
     94/***/ (function(module, exports, __webpack_require__) {
     95
     96"use strict";
     97eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeWCFM = function () {\n  function ShiptimizeWCFM() {\n    var _this = this;\n\n    _classCallCheck(this, ShiptimizeWCFM);\n\n    /** \n     * Because wcfm will first build the structure for the rules and only then set hte values \n     */\n    this.shipping_methods = ['wcfmmp_shipping_rates_by_weight', 'wcfmmp_shipping_rates'];\n\n    if (jQuery(\"#enable_store_shipping\").size() > 0) {\n      this.appendSelectors();\n    }\n\n    /** \n     * On save if keys are set then check if they produced a valid token \n     */\n    jQuery(\"#wcfm_settings_save_button\").on('click', function (evt) {\n      if (jQuery(\"input[name='shiptimize_public_key']\").val() && jQuery(\"input[name='shiptimize_private_key']\").val()) {\n        setTimeout(function () {\n          _this.checkIfKeysAreValid();\n        }, 500);\n      }\n    });\n  }\n\n  _createClass(ShiptimizeWCFM, [{\n    key: 'appendSelectors',\n    value: function appendSelectors() {\n      var _this2 = this;\n\n      var eCarrierOption = jQuery(\"<div><p class='wcfm_title'><strong>Shiptimize</strong></p></div>\");\n      var eCarriers = jQuery(\"<select class='wcfm-select shiptimize_carrier'><option>-</option>\");\n\n      for (var x = 0; x < shiptimize_carriers.length; ++x) {\n        eCarriers.append(\"<option value='\" + shiptimize_carriers[x].Id + \"'>\" + shiptimize_carriers[x].Name + \"</option>\");\n      }\n\n      eCarrierOption.append(eCarriers);\n\n      for (var x = 0; x < this.shipping_methods.length; ++x) {\n        this.appendShiptimizeTo(this.shipping_methods[x], eCarrierOption);\n      }\n\n      setTimeout(function () {\n        _this2.setSelectedCarrier();\n      }, 1000);\n    }\n  }, {\n    key: 'checkIfKeysAreValid',\n    value: function checkIfKeysAreValid() {\n      var data = { 'action': 'shiptimize_check_keys' };\n      jQuery.getJSON(ajaxurl, data, function (resp) {\n        if (resp.err) {\n          alert(resp.err);\n        }\n        console.log(resp);\n      });\n    }\n\n    /** \n     * \n     */\n\n  }, {\n    key: 'setSelectedCarrier',\n    value: function setSelectedCarrier() {\n      for (var x = 0; x < this.shipping_methods.length; ++x) {\n        var rule_name = 'shiptimize_' + this.shipping_methods[x];\n        var rules = window[rule_name];\n        var elem = jQuery(\"#\" + this.shipping_methods[x]).find('.shiptimize_carrier');\n        console.log(\"settting rules for \" + rule_name, rules);\n        if (typeof rules != 'undefined') {\n          for (var i = 0; i < rules.length; ++i) {\n            jQuery(elem.get(i)).val(rules[i]);\n          }\n        }\n      }\n    }\n\n    /** \n     * @param string - selector - The name of the selector \n     * @param element - eCarrierOption - a template for the carrier select \n     */\n\n  }, {\n    key: 'appendShiptimizeTo',\n    value: function appendShiptimizeTo(selector, eCarrierOption) {\n      var _this3 = this;\n\n      var elem = jQuery(\"#\" + selector).find('.country_select');\n      if (elem.size() == 0) {\n        setTimeout(function () {\n          _this3.appendShiptimizeTo(selector, eCarrierOption);\n        }, 500);\n        return;\n      }\n\n      var eSelect = eCarrierOption.find(\"select\");\n      console.log(eSelect);\n      eSelect.attr(\"name\", \"shiptimize_\" + selector + \"[]\");\n\n      eCarrierOption.clone().insertAfter(elem);\n    }\n  }, {\n    key: 'exportOrder',\n    value: function exportOrder(orderid) {\n      jQuery(\".notice\").remove();\n      jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n      jQuery.ajax({\n        'url': wcfm_params.ajax_url,\n        'type': 'GET',\n        'data': {\n          'action': 'shiptimize_wcfm_export_order',\n          'orderid': orderid\n        },\n        'success': function success(resp) {\n          console.log(resp);\n          jQuery(\"#shiptimize-export-status\").html(\"\");\n          jQuery(\".wcfm-top-element-container\").append(resp);\n        },\n        'error': function error(err) {\n          jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n          console.log(\"Error exporting \" + orderid, err);\n        }\n      });\n    }\n  }, {\n    key: 'exportSelectedOrders',\n    value: function exportSelectedOrders() {\n      jQuery(\".notice\").remove();\n      jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n      var orderids = [];\n      jQuery(\".shiptimize-wcfm-checkbox\").each(function (idx, elem) {\n        if (jQuery(this).is(\":checked\")) {\n          orderids.push(jQuery(this).val());\n        }\n      });\n\n      console.log(\"exporting \", orderids);\n      if (orderids.length == 0) {\n        alert(\"No orders where selected\");\n        return;\n      }\n\n      jQuery.ajax({\n        'url': wcfm_params.ajax_url,\n        'type': 'GET',\n        'data': {\n          'action': 'shiptimize_wcfm_export_orders',\n          'orderids': orderids\n        },\n        'success': function success(resp) {\n          console.log(resp);\n          jQuery(\"#shiptimize-export-status\").html(\"\");\n          jQuery(\".wcfm-top-element-container\").append(resp);\n        },\n        'error': function error(err) {\n          jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n          console.log(\"Error exporting \" + orderids, err);\n        }\n      });\n    }\n  }]);\n\n  return ShiptimizeWCFM;\n}();\n\njQuery(function () {\n  window.shiptimize_wcfm = new ShiptimizeWCFM();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdjZm0uanM/ZDJlZSJdLCJuYW1lcyI6WyJTaGlwdGltaXplV0NGTSIsInNoaXBwaW5nX21ldGhvZHMiLCJqUXVlcnkiLCJzaXplIiwiYXBwZW5kU2VsZWN0b3JzIiwib24iLCJldnQiLCJ2YWwiLCJzZXRUaW1lb3V0IiwiY2hlY2tJZktleXNBcmVWYWxpZCIsImVDYXJyaWVyT3B0aW9uIiwiZUNhcnJpZXJzIiwieCIsInNoaXB0aW1pemVfY2FycmllcnMiLCJsZW5ndGgiLCJhcHBlbmQiLCJJZCIsIk5hbWUiLCJhcHBlbmRTaGlwdGltaXplVG8iLCJzZXRTZWxlY3RlZENhcnJpZXIiLCJkYXRhIiwiZ2V0SlNPTiIsImFqYXh1cmwiLCJyZXNwIiwiZXJyIiwiYWxlcnQiLCJjb25zb2xlIiwibG9nIiwicnVsZV9uYW1lIiwicnVsZXMiLCJ3aW5kb3ciLCJlbGVtIiwiZmluZCIsImkiLCJnZXQiLCJzZWxlY3RvciIsImVTZWxlY3QiLCJhdHRyIiwiY2xvbmUiLCJpbnNlcnRBZnRlciIsIm9yZGVyaWQiLCJyZW1vdmUiLCJodG1sIiwic2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nIiwiYWpheCIsIndjZm1fcGFyYW1zIiwiYWpheF91cmwiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JkZXJpZHMiLCJlYWNoIiwiaWR4IiwiaXMiLCJwdXNoIiwic2hpcHRpbWl6ZV93Y2ZtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0lBR01BLGM7QUFFSiw0QkFBYztBQUFBOztBQUFBOztBQUNaOzs7QUFHQSxTQUFLQyxnQkFBTCxHQUF3QixDQUN0QixpQ0FEc0IsRUFFdEIsdUJBRnNCLENBQXhCOztBQUtBLFFBQUlDLE9BQU8sd0JBQVAsRUFDREMsSUFEQyxLQUNRLENBRFosRUFDZTtBQUNiLFdBQUtDLGVBQUw7QUFDRDs7QUFHRDs7O0FBR0FGLFdBQU8sNEJBQVAsRUFBcUNHLEVBQXJDLENBQXdDLE9BQXhDLEVBQWlELFVBQUND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SUFBUCxFQUFhSyxHQUFiLEVBQWQ7QUFDRDtBQUNGLE9BSkQ7O0FBTUFtQixjQUFRQyxHQUFSLENBQVksWUFBWixFQUEyQnNCLFFBQTNCO0FBQ0EsVUFBSUEsU0FBU25DLE1BQVQsSUFBbUIsQ0FBdkIsRUFBMEI7QUFDeEJXLGNBQU0sMEJBQU47QUFDQTtBQUNEOztBQUVEdkIsYUFBTzBDLElBQVAsQ0FBWTtBQUNWLGVBQU9DLFlBQVlDLFFBRFQ7QUFFVixnQkFBUSxLQUZFO0FBR1YsZ0JBQVE7QUFDTixvQkFBVSwrQkFESjtBQUVOLHNCQUFhRztBQUZQLFNBSEU7QUFPVixtQkFBWSxpQkFBVTFCLElBQVYsRUFBZ0I7QUFDMUJHLGtCQUFRQyxHQUFSLENBQVlKLElBQVo7QUFDQXJCLGlCQUFPLDJCQUFQLEVBQW9Dd0MsSUFBcEMsQ0FBeUMsRUFBekM7QUFDQXhDLGlCQUFPLDZCQUFQLEVBQXNDYSxNQUF0QyxDQUE2Q1EsSUFBN0M7QUFDRCxTQVhTO0FBWVYsaUJBQVUsZUFBVUMsR0FBVixFQUFlO0FBQ3ZCdEIsaUJBQU8sMkJBQVAsRUFBb0N3QyxJQUFwQyxDQUF5Q0ssS0FBS0MsU0FBTCxDQUFleEIsR0FBZixDQUF6QztBQUNBRSxrQkFBUUMsR0FBUixDQUFZLHFCQUFxQnNCLFFBQWpDLEVBQTJDekIsR0FBM0M7QUFDRDtBQWZTLE9BQVo7QUFpQkQ7Ozs7OztBQUdIdEIsT0FBTyxZQUFZO0FBQ2pCNEIsU0FBT3dCLGVBQVAsR0FBeUIsSUFBSXRELGNBQUosRUFBekI7QUFDRCxDQUZEIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS13Y2ZtLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplV0NGTSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIFxuICAgICAqIEJlY2F1c2Ugd2NmbSB3aWxsIGZpcnN0IGJ1aWxkIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBydWxlcyBhbmQgb25seSB0aGVuIHNldCBodGUgdmFsdWVzIFxuICAgICAqL1xuICAgIHRoaXMuc2hpcHBpbmdfbWV0aG9kcyA9IFtcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXNfYnlfd2VpZ2h0JyxcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXMnXG4gICAgXTtcblxuICAgIGlmIChqUXVlcnkoXCIjZW5hYmxlX3N0b3JlX3NoaXBwaW5nXCIpXG4gICAgICAuc2l6ZSgpID4gMCkge1xuICAgICAgdGhpcy5hcHBlbmRTZWxlY3RvcnMoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBPbiBzYXZlIGlmIGtleXMgYXJlIHNldCB0aGVuIGNoZWNrIGlmIHRoZXkgcHJvZHVjZWQgYSB2YWxpZCB0b2tlbiBcbiAgICAgKi8gXG4gICAgalF1ZXJ5KFwiI3djZm1fc2V0dGluZ3Nfc2F2ZV9idXR0b25cIikub24oJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgaWYoalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wdWJsaWNfa2V5J11cIikudmFsKCkgJiYgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wcml2YXRlX2tleSddXCIpLnZhbCgpKXtcbiAgICAgICAgc2V0VGltZW91dCggKCkgPT57IHRoaXMuY2hlY2tJZktleXNBcmVWYWxpZCgpOyB9LCA1MDAgKTsgXG4gICAgICB9XG4gICAgfSk7IFxuICB9XG5cbiAgYXBwZW5kU2VsZWN0b3JzKCkge1xuXG4gICAgdmFyIGVDYXJyaWVyT3B0aW9uID0galF1ZXJ5KFwiPGRpdj48cCBjbGFzcz0nd2NmbV90aXRsZSc+PHN0cm9uZz5TaGlwdGltaXplPC9zdHJvbmc+PC9wPjwvZGl2PlwiKTtcbiAgICB2YXIgZUNhcnJpZXJzID0galF1ZXJ5KFwiPHNlbGVjdCBjbGFzcz0nd2NmbS1zZWxlY3Qgc2hpcHRpbWl6ZV9jYXJyaWVyJz48b3B0aW9uPi08L29wdGlvbj5cIik7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3gpIHtcbiAgICAgIGVDYXJyaWVycy5hcHBlbmQoXCI8b3B0aW9uIHZhbHVlPSdcIiArIHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgKyBcIic+XCIgKyBzaGlwdGltaXplX2NhcnJpZXJzW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiKTtcbiAgICB9XG5cbiAgICBlQ2Fycmllck9wdGlvbi5hcHBlbmQoZUNhcnJpZXJzKTtcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5zaGlwcGluZ19tZXRob2RzLmxlbmd0aDsgKyt4KSB7XG4gICAgICB0aGlzLmFwcGVuZFNoaXB0aW1pemVUbyh0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF0sIGVDYXJyaWVyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDYXJyaWVyKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBjaGVja0lmS2V5c0FyZVZhbGlkKCl7XG4gICAgY29uc3QgZGF0YSA9IHsnYWN0aW9uJzonc2hpcHRpbWl6ZV9jaGVja19rZXlzJ307XG4gICAgalF1ZXJ5LmdldEpTT04oYWpheHVybCwgZGF0YSwgZnVuY3Rpb24ocmVzcCl7XG4gICAgICBpZihyZXNwLmVycil7XG4gICAgICAgIGFsZXJ0KHJlc3AuZXJyKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFxuICAgKiBcbiAgICovXG4gIHNldFNlbGVjdGVkQ2FycmllcigpIHtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuc2hpcHBpbmdfbWV0aG9kcy5sZW5ndGg7ICsreCkge1xuICAgICAgbGV0IHJ1bGVfbmFtZSA9ICdzaGlwdGltaXplXycgKyB0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF07XG4gICAgICBsZXQgcnVsZXMgPSB3aW5kb3dbcnVsZV9uYW1lXTtcbiAgICAgIGxldCBlbGVtID0galF1ZXJ5KFwiI1wiICsgdGhpcy5zaGlwcGluZ19tZXRob2RzW3hdKVxuICAgICAgLmZpbmQoJy5zaGlwdGltaXplX2NhcnJpZXInKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2V0dHRpbmcgcnVsZXMgZm9yIFwiICsgcnVsZV9uYW1lLCBydWxlcyk7XG4gICAgICBpZih0eXBlb2YocnVsZXMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgalF1ZXJ5KGVsZW0uZ2V0KGkpKS52YWwocnVsZXNbaV0pOyBcbiAgICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9XG4gIH1cblxuICAvKiogXG4gICAqIEBwYXJhbSBzdHJpbmcgLSBzZWxlY3RvciAtIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBlQ2Fycmllck9wdGlvbiAtIGEgdGVtcGxhdGUgZm9yIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICovXG4gIGFwcGVuZFNoaXB0aW1pemVUbyhzZWxlY3RvciwgZUNhcnJpZXJPcHRpb24pIHtcbiAgICBsZXQgZWxlbSA9IGpRdWVyeShcIiNcIiArIHNlbGVjdG9yKVxuICAgICAgLmZpbmQoJy5jb3VudHJ5X3NlbGVjdCcpO1xuICAgIGlmIChlbGVtLnNpemUoKSA9PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBlbmRTaGlwdGltaXplVG8oc2VsZWN0b3IsIGVDYXJyaWVyT3B0aW9uKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICB2YXIgZVNlbGVjdCA9IGVDYXJyaWVyT3B0aW9uLmZpbmQoXCJzZWxlY3RcIik7XG4gICAgY29uc29sZS5sb2coZVNlbGVjdCk7XG4gICAgZVNlbGVjdC5hdHRyKFwibmFtZVwiLCBcInNoaXB0aW1pemVfXCIgKyBzZWxlY3RvciArIFwiW11cIik7XG5cbiAgICBlQ2Fycmllck9wdGlvbi5jbG9uZSgpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoZWxlbSk7XG4gIH1cblxuICBleHBvcnRPcmRlcihvcmRlcmlkKXtcbiAgICBqUXVlcnkoXCIubm90aWNlXCIpLnJlbW92ZSgpO1xuICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChzaGlwdGltaXplX2xhYmVsX3NlbmRpbmcpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgICd1cmwnOiB3Y2ZtX3BhcmFtcy5hamF4X3VybCxcbiAgICAgICd0eXBlJzogJ0dFVCcsIFxuICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93Y2ZtX2V4cG9ydF9vcmRlcicsXG4gICAgICAgICdvcmRlcmlkJyA6IG9yZGVyaWQsXG4gICAgICB9LFxuICAgICAgJ3N1Y2Nlc3MnIDogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzcCk7IFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoXCJcIik7XG4gICAgICAgIGpRdWVyeShcIi53Y2ZtLXRvcC1lbGVtZW50LWNvbnRhaW5lclwiKS5hcHBlbmQocmVzcCk7XG4gICAgICB9LFxuICAgICAgJ2Vycm9yJyA6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGV4cG9ydGluZyBcIiArIG9yZGVyaWQsIGVycik7IFxuICAgICAgfVxuICAgIH0pOyBcbiAgfVxuXG4gIGV4cG9ydFNlbGVjdGVkT3JkZXJzKCl7XG4gICAgalF1ZXJ5KFwiLm5vdGljZVwiKS5yZW1vdmUoKTtcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nKTtcbiAgICB2YXIgb3JkZXJpZHMgPSBbXTsgXG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtd2NmbS1jaGVja2JveFwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsZWxlbSkge1xuICAgICAgaWYgKGpRdWVyeSh0aGlzKS5pcyhcIjpjaGVja2VkXCIpKSB7XG4gICAgICAgIG9yZGVyaWRzLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTsgXG4gICAgICB9XG4gICAgfSk7IFxuXG4gICAgY29uc29sZS5sb2coXCJleHBvcnRpbmcgXCIgLCBvcmRlcmlkcyk7IFxuICAgIGlmIChvcmRlcmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgYWxlcnQoXCJObyBvcmRlcnMgd2hlcmUgc2VsZWN0ZWRcIik7IFxuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBqUXVlcnkuYWpheCh7XG4gICAgICAndXJsJzogd2NmbV9wYXJhbXMuYWpheF91cmwsXG4gICAgICAndHlwZSc6ICdHRVQnLCBcbiAgICAgICdkYXRhJzoge1xuICAgICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2NmbV9leHBvcnRfb3JkZXJzJyxcbiAgICAgICAgJ29yZGVyaWRzJyA6IG9yZGVyaWRzLFxuICAgICAgfSxcbiAgICAgICdzdWNjZXNzJyA6IGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3ApOyBcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKFwiXCIpO1xuICAgICAgICBqUXVlcnkoXCIud2NmbS10b3AtZWxlbWVudC1jb250YWluZXJcIikuYXBwZW5kKHJlc3ApO1xuICAgICAgfSxcbiAgICAgICdlcnJvcicgOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBleHBvcnRpbmcgXCIgKyBvcmRlcmlkcywgZXJyKTsgXG4gICAgICB9XG4gICAgfSk7ICBcbiAgfSBcbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemVfd2NmbSA9IG5ldyBTaGlwdGltaXplV0NGTSgpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-wcfm.js\n");
     98
     99/***/ })
     100
     101/******/ });
  • shiptimize-for-woocommerce/trunk/assets/js/shiptimize.js

    r2724326 r2746465  
    1 !function(i){var B={};function g(I){if(B[I])return B[I].exports;var Q=B[I]={i:I,l:!1,exports:{}};return i[I].call(Q.exports,Q,Q.exports,g),Q.l=!0,Q.exports}g.m=i,g.c=B,g.d=function(I,Q,i){g.o(I,Q)||Object.defineProperty(I,Q,{enumerable:!0,get:i})},g.r=function(I){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},g.t=function(Q,I){if(1&I&&(Q=g(Q)),8&I)return Q;if(4&I&&"object"==typeof Q&&Q&&Q.__esModule)return Q;var i=Object.create(null);if(g.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:Q}),2&I&&"string"!=typeof Q)for(var B in Q)g.d(i,B,function(I){return Q[I]}.bind(null,B));return i},g.n=function(I){var Q=I&&I.__esModule?function(){return I.default}:function(){return I};return g.d(Q,"a",Q),Q},g.o=function(I,Q){return Object.prototype.hasOwnProperty.call(I,Q)},g.p="/shiptimize-for-woocommerce/assets/js",g(g.s=1)}([function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n  function ShiptimizeUtils() {\n    _classCallCheck(this, ShiptimizeUtils);\n  }\n\n  /** \n   * Inject Script into the page \n   * @param string src \n   */\n\n\n  _createClass(ShiptimizeUtils, [{\n    key: "injectExternalScript",\n    value: function injectExternalScript(src) {\n      var s = document.createElement("script");\n      s.setAttribute("src", src);\n      document.body.appendChild(s);\n    }\n\n    /** \n     * Inject a script string \n     */\n\n  }, {\n    key: "injectScript",\n    value: function injectScript(contents) {\n      var e = document.createElement("script");\n      e.value = contents;\n      document.body.appendChild(e);\n    }\n\n    /** \n     * Removes all not numeric chars from the string \n     *\n     * @param string string - the input string \n     * @return the string without chars that are not numbers \n     */\n\n  }, {\n    key: "removeNonNumeric",\n    value: function removeNonNumeric(string) {\n      return string.replace(/\\D/g, \'\');\n    }\n\n    /** \n     * Check if the given url exists and is valid\n     * We use this to check if the carrier icon exists given \n     * a url path and the naming convention {carrier_id}.svg \n     * Make sure the correct protocol is appended to the url http != https \n     * \n     * @return true it the url exists and is valid \n     */\n\n  }, {\n    key: "isUrlValid",\n    value: function isUrlValid(url) {\n      var http = new XMLHttpRequest();\n      http.open(\'HEAD\', url, false);\n      http.send();\n      return http.status == 200;\n    }\n\n    /** \n     * Open a new window with the provided URL \n     * @string url \n     * @return bool if the window was opened, false if popup blocker enabled \n     */\n\n  }, {\n    key: "openNewWindow",\n    value: function openNewWindow(url, options) {\n      var newWin = window.open(url, \'_blank\', options);\n      var blocked = !newWin || newWin.closed || typeof newWin.closed == \'undefined\';\n\n      return !blocked;\n    }\n  }]);\n\n  return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdlIGNhbiB1c2UgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50IHN0dWZmIFxuICovXG5jbGFzcyBTaGlwdGltaXplVXRpbHMge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgU2NyaXB0IGludG8gdGhlIHBhZ2UgXG4gICAgICogQHBhcmFtIHN0cmluZyBzcmMgXG4gICAgICovXG4gICAgaW5qZWN0RXh0ZXJuYWxTY3JpcHQoc3JjKSB7XG4gICAgICAgIGxldCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgc3JjKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgYSBzY3JpcHQgc3RyaW5nIFxuICAgICAqL1xuICAgIGluamVjdFNjcmlwdChjb250ZW50cykge1xuICAgICAgICBsZXQgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIGUudmFsdWUgPSBjb250ZW50cztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogUmVtb3ZlcyBhbGwgbm90IG51bWVyaWMgY2hhcnMgZnJvbSB0aGUgc3RyaW5nIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBzdHJpbmcgLSB0aGUgaW5wdXQgc3RyaW5nIFxuICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRob3V0IGNoYXJzIHRoYXQgYXJlIG5vdCBudW1iZXJzIFxuICAgICAqL1xuICAgIHJlbW92ZU5vbk51bWVyaWMoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgaWYgdGhlIGNhcnJpZXIgaWNvbiBleGlzdHMgZ2l2ZW4gXG4gICAgICogYSB1cmwgcGF0aCBhbmQgdGhlIG5hbWluZyBjb252ZW50aW9uIHtjYXJyaWVyX2lkfS5zdmcgXG4gICAgICogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IHByb3RvY29sIGlzIGFwcGVuZGVkIHRvIHRoZSB1cmwgaHR0cCAhPSBodHRwcyBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaXQgdGhlIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkIFxuICAgICAqLyBcbiAgICBpc1VybFZhbGlkKHVybCkge1xuICAgICAgICB2YXIgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKTtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgICAgIHJldHVybiBodHRwLnN0YXR1cyA9PSAyMDA7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIE9wZW4gYSBuZXcgd2luZG93IHdpdGggdGhlIHByb3ZpZGVkIFVSTCBcbiAgICAgKiBAc3RyaW5nIHVybCBcbiAgICAgKiBAcmV0dXJuIGJvb2wgaWYgdGhlIHdpbmRvdyB3YXMgb3BlbmVkLCBmYWxzZSBpZiBwb3B1cCBibG9ja2VyIGVuYWJsZWQgXG4gICAgICovICBcbiAgICBvcGVuTmV3V2luZG93KHVybCwgb3B0aW9ucyl7XG4gICAgICAgIGxldCBuZXdXaW4gPSB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zKTsgXG4gICAgICAgIGxldCBibG9ja2VkID0gIW5ld1dpbiB8fCBuZXdXaW4uY2xvc2VkIHx8IHR5cGVvZiBuZXdXaW4uY2xvc2VkPT0ndW5kZWZpbmVkJzsgXG5cbiAgICAgICAgcmV0dXJuICFibG9ja2VkOyBcbiAgICB9XG59XG5cblxubGV0IHV0aWxzID0gbmV3IFNoaXB0aW1pemVVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(2);\n\n__webpack_require__(3);\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWooCommerce = __webpack_require__(4);\n\nvar _shiptimizeWooCommerce2 = _interopRequireDefault(_shiptimizeWooCommerce);\n\nvar _shiptimizeGmaps = __webpack_require__(5);\n\nvar _shiptimizeGmaps2 = _interopRequireDefault(_shiptimizeGmaps);\n\nvar _shiptimizeOpenMap = __webpack_require__(6);\n\nvar _shiptimizeOpenMap2 = _interopRequireDefault(_shiptimizeOpenMap);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Class Shiptimize depends on jQuery. \n * Check if we are meant to append a map \n * \n * Platform dependent functions marked with   * @platformDependent \n */\nvar Shiptimize = function () {\n    function Shiptimize(ajax_url) {\n        _classCallCheck(this, Shiptimize);\n\n        this.markers = []; //pickup {lat, lng} \n        this.isMapLoaded = false;\n        this.gmaps_key = typeof shiptimize_maps_key == 'undefined' ? '' : shiptimize_maps_key;\n        this.openMapMarkerIcons = {};\n        this.ajax_url = ajax_url; // platform dependent \n\n        this.platform = new _shiptimizeWooCommerce2.default(this.ajax_url);\n\n        this.map = this.gmaps_key ? new _shiptimizeGmaps2.default(this.gmaps_key) : new _shiptimizeOpenMap2.default();\n        this.platform.isCheckout();\n        this.map.grantReady();\n    }\n\n    /** \n     * Show the map to the user \n     */\n\n\n    _createClass(Shiptimize, [{\n        key: 'showMap',\n        value: function showMap() {\n            this.userScroll = jQuery('html,body').scrollTop();\n            jQuery('html,body').scrollTop(0);\n            jQuery(\".shiptimize-pickup\").addClass(\"active\");\n        }\n\n        /** \n         * Hide the map   \n         */\n\n    }, {\n        key: 'hideMap',\n        value: function hideMap() {\n            jQuery(\".shiptimize-pickup\").removeClass(\"active\");\n            jQuery(\".shiptimize-pickup__error\").hide();\n            jQuery('html,body').scrollTop(this.userScroll);\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            this.map.clearMarkers();\n        }\n\n        /** \n         * Generate the inputs for the user to append extra info if necessary \n         * The id of these fields is in the format shiptimize_extra_{PointId}_{FieldId}\n         */\n\n    }, {\n        key: 'getExtendedInfoHtml',\n        value: function getExtendedInfoHtml(pickupPoint) {\n            if (!pickupPoint.ExtendedInfo || typeof pickupPoint.ExtendedInfo.length == 'undefined') {\n                return \"\";\n            }\n\n            var html = '';\n\n            for (var x = 0; pickupPoint.ExtendedInfo && x < pickupPoint.ExtendedInfo.length; ++x) {\n                var extraInfo = pickupPoint.ExtendedInfo[x];\n                html += '<div class=\"shiptimize-pickup__extended\">' + '<label class=\"shiptimize-pickup__extended_label \">' + extraInfo.Tekst + '</label>' + '<input type=\"text\" name=\"shiptimize_pickup_extended_value\" value=\"\" id=\"shiptimize_extra_' + pickupPoint.PointId + '_' + extraInfo.FieldId + '\"/> ' + '<input type=\"hidden\" name=\"shiptimize_pickup_extended_id\" id=\"shiptimize_pickup\" value=\"' + extraInfo.FieldId + '\"/> ' + '</div>';\n            }\n\n            return html;\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         */\n\n    }, {\n        key: 'selectPointFromListInMap',\n        value: function selectPointFromListInMap(idx) {\n            jQuery(\"input[name='shiptimize__point']\").prop('checked', false);\n            this.map.selectMarkerByIdx(idx);\n\n            jQuery(jQuery(\"input[name='shiptimize__point']\").get(idx)).prop('checked', true);\n        }\n\n        /** \n         * When the user clicks the validate button \n         */\n\n    }, {\n        key: 'selectFromList',\n        value: function selectFromList() {\n            var idx = jQuery(\"input[name='shiptimize__point']:checked\").val();\n            var pickup = this.pickupPoints[idx];\n            var extra = '';\n\n            for (var i = 0; pickup.ExtendedInfo && i < pickup.ExtendedInfo.length; ++i) {\n                extra += \"<br/>\" + pickup.ExtendedInfo[i].Tekst + ': ' + jQuery(\"#shiptimize_extra_\" + pickup.PointId + \"_\" + pickup.ExtendedInfo[i].FieldId).val();\n            }\n\n            jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup.Information.Name + \" \" + pickup.Information.Address + \" \" + extra);\n\n            this.platform.setPickupPoint(pickup);\n            this.hideMap();\n        }\n\n        /** \n         *  Returns the distance between 2 (lat,lng) points in kms \n         */\n\n    }, {\n        key: 'getDistance',\n        value: function getDistance(latlng, latlng2) {\n\n            var R = 6371e3; // metres\n            var φ1 = latlng.lat().toRadians();\n            var φ2 = latlng2.lng().toRadians();\n\n            var Δφ = (latln2.lat() - latlng.lng()).toRadians();\n            var Δλ = (latln2.lng() - latlng.lon()).toRadians();\n\n            var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n            var d = Math.floor(R * c / 1000);\n        }\n\n        /** \n         * Show the map and query the server for pickup locations near the shipping address provided by the client\n         * center the map on the first point \n         * remove old markers \n         * add the new markers  \n         */\n\n    }, {\n        key: 'getPickupLocations',\n        value: function getPickupLocations(evt) {\n            var _this = this;\n\n            if (!this.map || !this.map.isScriptLoaded) {\n                console.log(\"map is not loaded ...\");\n                return;\n            }\n\n            this.pickupPointsLoadStart();\n\n            /** because some version of woo will trigger a call to checkout and finish  the order **/\n            evt.preventDefault();\n            evt.stopPropagation();\n\n            this.showMap();\n\n            var data = this.platform.getShippingData();\n            data.action = 'shiptimize_pickup_locations';\n\n            this.map.setCarrierIcon(data.CarrierId);\n\n            this.map.geocode(data, function (geocode) {\n                _this.getPickupLocationsFromGeocodedAddr(geocode, data);\n            });\n        }\n    }, {\n        key: 'getPickupLocationsFromGeocodedAddr',\n        value: function getPickupLocationsFromGeocodedAddr(geocode, data) {\n            var _this2 = this;\n\n            this.resetUI();\n\n            if (!geocode.lng || !geocode.lat) {\n                this.pickupPointsLoadStop();\n                this.pickupError(shiptimize_geolocationfailed);\n                return;\n            }\n\n            data.Address.Country = geocode.iso2;\n            data.Address.Long = geocode.lng;\n            data.Address.Lat = geocode.lat;\n\n            console.log(data);\n            console.log(geocode);\n\n            jQuery.getJSON(this.ajax_url, data, function (pickupPoints) {\n                // We have the points remove the loader \n                _this2.pickupPointsLoadStop();\n\n                if (pickupPoints.length == 0) {\n                    console.log(\"no pickup points found for this address \");\n                    return;\n                }\n\n                console.log(pickupPoints);\n                if (pickupPoints.Error.Id == 0 && pickupPoints.Point.length > 0) {\n                    jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").show();\n                    _this2.setPickupLocations(pickupPoints.Point);\n                } else {\n                    console.log(\"The api returned an error: \", pickupPoints.Error); //pickupPoints.Error.Info || \n                    _this2.pickupError(shiptimize_no_points_found);\n                }\n            }).fail(function (resp) {\n                console.log(\"Error getting points, shiptimize api error? report to shiptimize. \", resp.responseText); //pickupPoints.Error.Info || \n                _this2.pickupError(shiptimize_no_points_found);\n            });\n        }\n    }, {\n        key: 'resetUI',\n        value: function resetUI() {\n            jQuery(\".shiptimize-pickup__error\").hide();\n            this.map.clearMarkers();\n        }\n\n        /** \n         * @param string info - the message to display \n         */\n\n    }, {\n        key: 'pickupError',\n        value: function pickupError(info) {\n            this.pickupPoints = [];\n\n            var eError = jQuery(\".shiptimize-pickup__error\");\n            eError.html(info);\n            eError.show();\n\n            jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").hide();\n        }\n\n        /** \n         * Append the pickup Locations to the map\n         * @param array pickupPoints - an array of available pickup points \n         */\n\n    }, {\n        key: 'setPickupLocations',\n        value: function setPickupLocations(pickupPoints) {\n            var _this3 = this;\n\n            jQuery(\".shiptimize-pickup__error\").hide();\n\n            this.pickupPoints = pickupPoints;\n            this.map.clearMarkers();\n            this.map.centerMap(this.pickupPoints[0].Lat, this.pickupPoints[1].Long);\n            this.map.addMarkers(pickupPoints, function (idx) {\n                _this3.selectPointFromListInMap(idx);\n            });\n            this.setOptionsForAddress(pickupPoints);\n\n            typeof this.map.map.invalidateSize != 'undefined' && this.map.map.invalidateSize();\n\n            setTimeout(function () {\n                _this3.map.fitBounds();\n            }, 200);\n        }\n\n        /** \n         * @param pickupPoints[] - [] of pickup points returned by the api \n         */\n\n    }, {\n        key: 'setOptionsForAddress',\n        value: function setOptionsForAddress(pickupPoints) {\n\n            var html = '';\n            for (var i = 0; i < pickupPoints.length; ++i) {\n                html += '<div class=\"shiptimize-pickup__point\">' + '<input type=\"radio\" value=\"' + i + '\" name=\"shiptimize__point\"  onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\"/>' + '<span class=\"shiptimize-pickup__point_description\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\">' + '<span>' + (pickupPoints[i].Information.Name ? pickupPoints[i].Information.Name + '<br/>' : '') + pickupPoints[i].Information.Address + '</span>' + this.getExtendedInfoHtml(pickupPoints[i]) + '</span>' + '</div>';\n            }\n            console.log(html);\n\n            jQuery(\".shiptimize-pickup__other\").html(html);\n        }\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            this.map.loadMap();\n        }\n    }, {\n        key: 'pickupPointsLoadStart',\n        value: function pickupPointsLoadStart() {\n            jQuery(\".shiptimize-pickup__mapWrapper\").addClass('loading');\n        }\n    }, {\n        key: 'pickupPointsLoadStop',\n        value: function pickupPointsLoadStop() {\n            jQuery(\".shiptimize-pickup__mapWrapper\").removeClass('loading');\n        }\n    }]);\n\n    return Shiptimize;\n}();\n\njQuery(function () {\n    if (typeof woocommerce_params != 'undefined') {\n        window.shiptimize = new Shiptimize(woocommerce_params.ajax_url);\n    }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdG1pemUuanM/NjljNyJdLCJuYW1lcyI6WyJTaGlwdGltaXplIiwiYWpheF91cmwiLCJtYXJrZXJzIiwiaXNNYXBMb2FkZWQiLCJnbWFwc19rZXkiLCJzaGlwdGltaXplX21hcHNfa2V5Iiwib3Blbk1hcE1hcmtlckljb25zIiwicGxhdGZvcm0iLCJXb29Db21tZXJjZSIsIm1hcCIsIkdvb2dsZU1hcCIsIk9wZW5TdHJlZXRNYXAiLCJpc0NoZWNrb3V0IiwiZ3JhbnRSZWFkeSIsInVzZXJTY3JvbGwiLCJqUXVlcnkiLCJzY3JvbGxUb3AiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGlkZSIsImNsZWFyTWFya2VycyIsInBpY2t1cFBvaW50IiwiRXh0ZW5kZWRJbmZvIiwibGVuZ3RoIiwiaHRtbCIsIngiLCJleHRyYUluZm8iLCJUZWtzdCIsIlBvaW50SWQiLCJGaWVsZElkIiwiaWR4IiwicHJvcCIsInNlbGVjdE1hcmtlckJ5SWR4IiwiZ2V0IiwidmFsIiwicGlja3VwIiwicGlja3VwUG9pbnRzIiwiZXh0cmEiLCJpIiwic2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwic2V0UGlja3VwUG9pbnQiLCJoaWRlTWFwIiwibGF0bG5nIiwibGF0bG5nMiIsIlIiLCLPhjEiLCJsYXQiLCJ0b1JhZGlhbnMiLCLPhjIiLCJsbmciLCLOlM+GIiwibGF0bG4yIiwizpTOuyIsImxvbiIsImEiLCJNYXRoIiwic2luIiwiY29zIiwiYyIsImF0YW4yIiwic3FydCIsImQiLCJmbG9vciIsImV2dCIsImlzU2NyaXB0TG9hZGVkIiwiY29uc29sZSIsImxvZyIsInBpY2t1cFBvaW50c0xvYWRTdGFydCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwic2hvd01hcCIsImRhdGEiLCJnZXRTaGlwcGluZ0RhdGEiLCJhY3Rpb24iLCJzZXRDYXJyaWVySWNvbiIsIkNhcnJpZXJJZCIsImdlb2NvZGUiLCJnZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyIiwicmVzZXRVSSIsInBpY2t1cFBvaW50c0xvYWRTdG9wIiwicGlja3VwRXJyb3IiLCJzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkIiwiQ291bnRyeSIsImlzbzIiLCJMb25nIiwiTGF0IiwiZ2V0SlNPTiIsIkVycm9yIiwiSWQiLCJQb2ludCIsInNob3ciLCJzZXRQaWNrdXBMb2NhdGlvbnMiLCJzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCIsImZhaWwiLCJyZXNwIiwicmVzcG9uc2VUZXh0IiwiaW5mbyIsImVFcnJvciIsImNlbnRlck1hcCIsImFkZE1hcmtlcnMiLCJzZWxlY3RQb2ludEZyb21MaXN0SW5NYXAiLCJzZXRPcHRpb25zRm9yQWRkcmVzcyIsImludmFsaWRhdGVTaXplIiwic2V0VGltZW91dCIsImZpdEJvdW5kcyIsImdldEV4dGVuZGVkSW5mb0h0bWwiLCJsb2FkTWFwIiwid29vY29tbWVyY2VfcGFyYW1zIiwid2luZG93Iiwic2hpcHRpbWl6ZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7OztBQUVBOzs7Ozs7SUFNTUEsVTtBQUVGLHdCQUFZQyxRQUFaLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUtDLE9BQUwsR0FBZSxFQUFmLENBRGtCLENBQ0M7QUFDbkIsYUFBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLGFBQUtDLFNBQUwsR0FBaUIsT0FBT0MsbUJBQVAsSUFBK0IsV0FBL0IsR0FBOEMsRUFBOUMsR0FBbURBLG1CQUFwRTtBQUNBLGFBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0EsYUFBS0wsUUFBTCxHQUFnQkEsUUFBaEIsQ0FMa0IsQ0FLUTs7QUFFMUIsYUFBS00sUUFBTCxHQUFnQixJQUFJQywrQkFBSixDQUFnQixLQUFLUCxRQUFyQixDQUFoQjs7QUFFQSxhQUFLUSxHQUFMLEdBQVcsS0FBS0wsU0FBTCxHQUFpQixJQUFJTSx5QkFBSixDQUFjLEtBQUtOLFNBQW5CLENBQWpCLEdBQWlELElBQUlPLDJCQUFKLEVBQTVEO0FBQ0EsYUFBS0osUUFBTCxDQUFjSyxVQUFkO0FBQ0EsYUFBS0gsR0FBTCxDQUFTSSxVQUFUO0FBQ0g7O0FBRUQ7Ozs7Ozs7a0NBR1U7QUFDTixpQkFBS0MsVUFBTCxHQUFrQkMsT0FBTyxXQUFQLEVBQW9CQyxTQUFwQixFQUFsQjtBQUNBRCxtQkFBTyxXQUFQLEVBQW9CQyxTQUFwQixDQUE4QixDQUE5QjtBQUNBRCxtQkFBTyxvQkFBUCxFQUE2QkUsUUFBN0IsQ0FBc0MsUUFBdEM7QUFDSDs7QUFFRDs7Ozs7O2tDQUdVO0FBQ05GLG1CQUFPLG9CQUFQLEVBQTZCRyxXQUE3QixDQUF5QyxRQUF6QztBQUNBSCxtQkFBTywyQkFBUCxFQUFvQ0ksSUFBcEM7QUFDQUosbUJBQU8sV0FBUCxFQUFvQkMsU0FBcEIsQ0FBOEIsS0FBS0YsVUFBbkM7QUFDSDs7O3VDQUVjO0FBQ1gsaUJBQUtMLEdBQUwsQ0FBU1csWUFBVDtBQUNIOztBQUVEOzs7Ozs7OzRDQUlvQkMsVyxFQUFhO0FBQzdCLGdCQUFJLENBQUNBLFlBQVlDLFlBQWIsSUFBNkIsT0FBT0QsWUFBWUMsWUFBWixDQUF5QkMsTUFBaEMsSUFBMEMsV0FBM0UsRUFBd0Y7QUFDcEYsdUJBQU8sRUFBUDtBQUNIOztBQUVELGdCQUFJQyxPQUFPLEVBQVg7O0FBRUEsaUJBQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCSixZQUFZQyxZQUFaLElBQTRCRyxJQUFJSixZQUFZQyxZQUFaLENBQXlCQyxNQUF6RSxFQUFpRixFQUFFRSxDQUFuRixFQUFzRjtBQUNsRixvQkFBSUMsWUFBWUwsWUFBWUMsWUFBWixDQUF5QkcsQ0FBekIsQ0FBaEI7QUFDQUQsd0JBQVEsOENBQ0osb0RBREksR0FDbURFLFVBQVVDLEtBRDdELEdBQ3FFLFVBRHJFLEdBRUosMkZBRkksR0FFMEZOLFlBQVlPLE9BRnRHLEdBRWdILEdBRmhILEdBRXNIRixVQUFVRyxPQUZoSSxHQUUwSSxNQUYxSSxHQUdKLDBGQUhJLEdBR3lGSCxVQUFVRyxPQUhuRyxHQUc2RyxNQUg3RyxHQUlKLFFBSko7QUFLSDs7QUFFRCxtQkFBT0wsSUFBUDtBQUNIOztBQUVEOzs7Ozs7O2lEQUl5Qk0sRyxFQUFLO0FBQzFCZixtQkFBTyxpQ0FBUCxFQUEwQ2dCLElBQTFDLENBQStDLFNBQS9DLEVBQTBELEtBQTFEO0FBQ0EsaUJBQUt0QixHQUFMLENBQVN1QixpQkFBVCxDQUEyQkYsR0FBM0I7O0FBRUFmLG1CQUFPQSxPQUFPLGlDQUFQLEVBQTBDa0IsR0FBMUMsQ0FBOENILEdBQTlDLENBQVAsRUFBMkRDLElBQTNELENBQWdFLFNBQWhFLEVBQTJFLElBQTNFO0FBQ0g7O0FBRUQ7Ozs7Ozt5Q0FHaUI7QUFDYixnQkFBSUQsTUFBTWYsT0FBTyx5Q0FBUCxFQUFrRG1CLEdBQWxELEVBQVY7QUFDQSxnQkFBSUMsU0FBUyxLQUFLQyxZQUFMLENBQWtCTixHQUFsQixDQUFiO0FBQ0EsZ0JBQUlPLFFBQVEsRUFBWjs7QUFFQSxpQkFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JILE9BQU9iLFlBQVAsSUFBdUJnQixJQUFJSCxPQUFPYixZQUFQLENBQW9CQyxNQUEvRCxFQUF1RSxFQUFFZSxDQUF6RSxFQUE0RTtBQUN4RUQseUJBQVMsVUFBVUYsT0FBT2IsWUFBUCxDQUFvQmdCLENBQXBCLEVBQXVCWCxLQUFqQyxHQUF5QyxJQUF6QyxHQUFnRFosT0FBTyx1QkFBdUJvQixPQUFPUCxPQUE5QixHQUF3QyxHQUF4QyxHQUE4Q08sT0FBT2IsWUFBUCxDQUFvQmdCLENBQXBCLEVBQXVCVCxPQUE1RSxFQUFxRkssR0FBckYsRUFBekQ7QUFDSDs7QUFFRG5CLG1CQUFPLGlDQUFQLEVBQTBDUyxJQUExQyxDQUErQ2UsNkJBQTZCLEtBQTdCLEdBQXFDSixPQUFPSyxXQUFQLENBQW1CQyxJQUF4RCxHQUErRCxHQUEvRCxHQUFxRU4sT0FBT0ssV0FBUCxDQUFtQkUsT0FBeEYsR0FBa0csR0FBbEcsR0FBd0dMLEtBQXZKOztBQUVBLGlCQUFLOUIsUUFBTCxDQUFjb0MsY0FBZCxDQUE2QlIsTUFBN0I7QUFDQSxpQkFBS1MsT0FBTDtBQUNIOztBQUdEOzs7Ozs7b0NBR1lDLE0sRUFBUUMsTyxFQUFTOztBQUV6QixnQkFBSUMsSUFBSSxNQUFSLENBRnlCLENBRVQ7QUFDaEIsZ0JBQUlDLEtBQUtILE9BQU9JLEdBQVAsR0FBYUMsU0FBYixFQUFUO0FBQ0EsZ0JBQUlDLEtBQUtMLFFBQVFNLEdBQVIsR0FBY0YsU0FBZCxFQUFUOztBQUVBLGdCQUFJRyxLQUFLLENBQUNDLE9BQU9MLEdBQVAsS0FBZUosT0FBT08sR0FBUCxFQUFoQixFQUE4QkYsU0FBOUIsRUFBVDtBQUNBLGdCQUFJSyxLQUFLLENBQUNELE9BQU9GLEdBQVAsS0FBZVAsT0FBT1csR0FBUCxFQUFoQixFQUE4Qk4sU0FBOUIsRUFBVDs7QUFFQSxnQkFBSU8sSUFBSUMsS0FBS0MsR0FBTCxDQUFTTixLQUFLLENBQWQsSUFBbUJLLEtBQUtDLEdBQUwsQ0FBU04sS0FBSyxDQUFkLENBQW5CLEdBQ0pLLEtBQUtFLEdBQUwsQ0FBU1osRUFBVCxJQUFlVSxLQUFLRSxHQUFMLENBQVNULEVBQVQsQ0FBZixHQUNBTyxLQUFLQyxHQUFMLENBQVNKLEtBQUssQ0FBZCxDQURBLEdBQ21CRyxLQUFLQyxHQUFMLENBQVNKLEtBQUssQ0FBZCxDQUZ2QjtBQUdBLGdCQUFJTSxJQUFJLElBQUlILEtBQUtJLEtBQUwsQ0FBV0osS0FBS0ssSUFBTCxDQUFVTixDQUFWLENBQVgsRUFBeUJDLEtBQUtLLElBQUwsQ0FBVSxJQUFJTixDQUFkLENBQXpCLENBQVo7O0FBRUEsZ0JBQUlPLElBQUlOLEtBQUtPLEtBQUwsQ0FBV2xCLElBQUljLENBQUosR0FBUSxJQUFuQixDQUFSO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzsyQ0FNbUJLLEcsRUFBSztBQUFBOztBQUNwQixnQkFBRyxDQUFDLEtBQUt6RCxHQUFOLElBQWEsQ0FBQyxLQUFLQSxHQUFMLENBQVMwRCxjQUExQixFQUF5QztBQUNyQ0Msd0JBQVFDLEdBQVIsQ0FBWSx1QkFBWjtBQUNBO0FBQ0g7O0FBRUQsaUJBQUtDLHFCQUFMOztBQUVBO0FBQ0FKLGdCQUFJSyxjQUFKO0FBQ0FMLGdCQUFJTSxlQUFKOztBQUVBLGlCQUFLQyxPQUFMOztBQUVBLGdCQUFJQyxPQUFPLEtBQUtuRSxRQUFMLENBQWNvRSxlQUFkLEVBQVg7QUFDQUQsaUJBQUtFLE1BQUwsR0FBYyw2QkFBZDs7QUFFQSxpQkFBS25FLEdBQUwsQ0FBU29FLGNBQVQsQ0FBd0JILEtBQUtJLFNBQTdCOztBQUVBLGlCQUFLckUsR0FBTCxDQUFTc0UsT0FBVCxDQUFpQkwsSUFBakIsRUFBdUIsVUFBQ0ssT0FBRCxFQUFhO0FBQUUsc0JBQUtDLGtDQUFMLENBQXdDRCxPQUF4QyxFQUFpREwsSUFBakQ7QUFBeUQsYUFBL0Y7QUFDSDs7OzJEQUdrQ0ssTyxFQUFTTCxJLEVBQU07QUFBQTs7QUFDOUMsaUJBQUtPLE9BQUw7O0FBRUEsZ0JBQUcsQ0FBQ0YsUUFBUTNCLEdBQVQsSUFBZ0IsQ0FBQzJCLFFBQVE5QixHQUE1QixFQUFpQztBQUM3QixxQkFBS2lDLG9CQUFMO0FBQ0EscUJBQUtDLFdBQUwsQ0FBaUJDLDRCQUFqQjtBQUNBO0FBQ0g7O0FBRURWLGlCQUFLaEMsT0FBTCxDQUFhMkMsT0FBYixHQUF1Qk4sUUFBUU8sSUFBL0I7QUFDQVosaUJBQUtoQyxPQUFMLENBQWE2QyxJQUFiLEdBQW9CUixRQUFRM0IsR0FBNUI7QUFDQXNCLGlCQUFLaEMsT0FBTCxDQUFhOEMsR0FBYixHQUFtQlQsUUFBUTlCLEdBQTNCOztBQUVBbUIsb0JBQVFDLEdBQVIsQ0FBWUssSUFBWjtBQUNBTixvQkFBUUMsR0FBUixDQUFZVSxPQUFaOztBQUVBaEUsbUJBQU8wRSxPQUFQLENBQWUsS0FBS3hGLFFBQXBCLEVBQThCeUUsSUFBOUIsRUFBb0MsVUFBQ3RDLFlBQUQsRUFBa0I7QUFDbEQ7QUFDQSx1QkFBSzhDLG9CQUFMOztBQUVBLG9CQUFJOUMsYUFBYWIsTUFBYixJQUF1QixDQUEzQixFQUE4QjtBQUMxQjZDLDRCQUFRQyxHQUFSLENBQVksMENBQVo7QUFDQTtBQUNIOztBQUVERCx3QkFBUUMsR0FBUixDQUFZakMsWUFBWjtBQUNBLG9CQUFJQSxhQUFhc0QsS0FBYixDQUFtQkMsRUFBbkIsSUFBeUIsQ0FBekIsSUFBOEJ2RCxhQUFhd0QsS0FBYixDQUFtQnJFLE1BQW5CLEdBQTRCLENBQTlELEVBQWtFO0FBQzlEUiwyQkFBTyxxREFBUCxFQUE4RDhFLElBQTlEO0FBQ0EsMkJBQUtDLGtCQUFMLENBQXdCMUQsYUFBYXdELEtBQXJDO0FBQ0gsaUJBSEQsTUFHTztBQUNIeEIsNEJBQVFDLEdBQVIsQ0FBWSw2QkFBWixFQUEyQ2pDLGFBQWFzRCxLQUF4RCxFQURHLENBQzZEO0FBQ2hFLDJCQUFLUCxXQUFMLENBQWlCWSwwQkFBakI7QUFDSDtBQUVKLGFBbEJELEVBa0JHQyxJQWxCSCxDQWtCUyxVQUFDQyxJQUFELEVBQVU7QUFDZjdCLHdCQUFRQyxHQUFSLENBQVksb0VBQVosRUFBa0Y0QixLQUFLQyxZQUF2RixFQURlLENBQ3VGO0FBQ3RHLHVCQUFLZixXQUFMLENBQWlCWSwwQkFBakI7QUFDSCxhQXJCRDtBQXNCSDs7O2tDQUVRO0FBQ0xoRixtQkFBTywyQkFBUCxFQUFvQ0ksSUFBcEM7QUFDQSxpQkFBS1YsR0FBTCxDQUFTVyxZQUFUO0FBQ0g7O0FBRUQ7Ozs7OztvQ0FHWStFLEksRUFBTTtBQUNkLGlCQUFLL0QsWUFBTCxHQUFvQixFQUFwQjs7QUFFQSxnQkFBSWdFLFNBQVNyRixPQUFPLDJCQUFQLENBQWI7QUFDQXFGLG1CQUFPNUUsSUFBUCxDQUFZMkUsSUFBWjtBQUNBQyxtQkFBT1AsSUFBUDs7QUFFQTlFLG1CQUFPLHFEQUFQLEVBQThESSxJQUE5RDtBQUNIOztBQUVEOzs7Ozs7OzJDQUltQmlCLFksRUFBYztBQUFBOztBQUM3QnJCLG1CQUFPLDJCQUFQLEVBQW9DSSxJQUFwQzs7QUFFQSxpQkFBS2lCLFlBQUwsR0FBb0JBLFlBQXBCO0FBQ0EsaUJBQUszQixHQUFMLENBQVNXLFlBQVQ7QUFDQSxpQkFBS1gsR0FBTCxDQUFTNEYsU0FBVCxDQUFtQixLQUFLakUsWUFBTCxDQUFrQixDQUFsQixFQUFxQm9ELEdBQXhDLEVBQTZDLEtBQUtwRCxZQUFMLENBQWtCLENBQWxCLEVBQXFCbUQsSUFBbEU7QUFDQSxpQkFBSzlFLEdBQUwsQ0FBUzZGLFVBQVQsQ0FBb0JsRSxZQUFwQixFQUFrQyxVQUFDTixHQUFELEVBQVM7QUFBRSx1QkFBS3lFLHdCQUFMLENBQThCekUsR0FBOUI7QUFBcUMsYUFBbEY7QUFDQSxpQkFBSzBFLG9CQUFMLENBQTBCcEUsWUFBMUI7O0FBRUMsbUJBQU8sS0FBSzNCLEdBQUwsQ0FBU0EsR0FBVCxDQUFhZ0csY0FBcEIsSUFBdUMsV0FBeEMsSUFBd0QsS0FBS2hHLEdBQUwsQ0FBU0EsR0FBVCxDQUFhZ0csY0FBYixFQUF4RDs7QUFFQUMsdUJBQWEsWUFBTTtBQUNmLHVCQUFLakcsR0FBTCxDQUFTa0csU0FBVDtBQUNILGFBRkQsRUFFRyxHQUZIO0FBR0g7O0FBRUQ7Ozs7Ozs2Q0FHcUJ2RSxZLEVBQWM7O0FBRS9CLGdCQUFJWixPQUFPLEVBQVg7QUFDQSxpQkFBSyxJQUFJYyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLGFBQWFiLE1BQWpDLEVBQXlDLEVBQUVlLENBQTNDLEVBQThDO0FBQzFDZCx3QkFBUSwyQ0FDSiw2QkFESSxHQUM0QmMsQ0FENUIsR0FDZ0MsMkVBRGhDLEdBQzhHQSxDQUQ5RyxHQUNrSCxNQURsSCxHQUVKLGtHQUZJLEdBRWlHQSxDQUZqRyxHQUVxRyxLQUZyRyxHQUdKLFFBSEksSUFHUUYsYUFBYUUsQ0FBYixFQUFnQkUsV0FBaEIsQ0FBNEJDLElBQTVCLEdBQWtDTCxhQUFhRSxDQUFiLEVBQWdCRSxXQUFoQixDQUE0QkMsSUFBNUIsR0FBbUMsT0FBckUsR0FBK0UsRUFIdkYsSUFJREwsYUFBYUUsQ0FBYixFQUFnQkUsV0FBaEIsQ0FBNEJFLE9BSjNCLEdBSXFDLFNBSnJDLEdBS0osS0FBS2tFLG1CQUFMLENBQXlCeEUsYUFBYUUsQ0FBYixDQUF6QixDQUxJLEdBTUosU0FOSSxHQVNKLFFBVEo7QUFVSDtBQUNEOEIsb0JBQVFDLEdBQVIsQ0FBWTdDLElBQVo7O0FBRUFULG1CQUFPLDJCQUFQLEVBQW9DUyxJQUFwQyxDQUF5Q0EsSUFBekM7QUFDSDs7O2tDQUdTO0FBQ04saUJBQUtmLEdBQUwsQ0FBU29HLE9BQVQ7QUFDSDs7O2dEQUV1QjtBQUN0QjlGLG1CQUFPLGdDQUFQLEVBQXlDRSxRQUF6QyxDQUFrRCxTQUFsRDtBQUNEOzs7K0NBRXNCO0FBQ3JCRixtQkFBTyxnQ0FBUCxFQUF5Q0csV0FBekMsQ0FBcUQsU0FBckQ7QUFDRDs7Ozs7O0FBR0xILE9BQU8sWUFBVztBQUNkLFFBQUcsT0FBTytGLGtCQUFQLElBQThCLFdBQWpDLEVBQTZDO0FBQ3pDQyxlQUFPQyxVQUFQLEdBQW9CLElBQUloSCxVQUFKLENBQWU4RyxtQkFBbUI3RyxRQUFsQyxDQUFwQjtBQUNIO0FBQ0osQ0FKRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL3Njc3Mvc2hpcHRpbWl6ZS5zY3NzJztcbmltcG9ydCAnLi9jc3MvbGVhZmxldC5jc3MnO1xuXG5pbXBvcnQgVXRpbHMgZnJvbSAnLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzJztcbmltcG9ydCBXb29Db21tZXJjZSBmcm9tICcuL2pzL3NoaXB0aW1pemUtd29vLWNvbW1lcmNlLmpzJztcblxuaW1wb3J0IEdvb2dsZU1hcCBmcm9tICcuL2pzL3NoaXB0aW1pemUtZ21hcHMuanMnO1xuaW1wb3J0IE9wZW5TdHJlZXRNYXAgZnJvbSAnLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzJztcblxuLyoqIFxuICogQ2xhc3MgU2hpcHRpbWl6ZSBkZXBlbmRzIG9uIGpRdWVyeS4gXG4gKiBDaGVjayBpZiB3ZSBhcmUgbWVhbnQgdG8gYXBwZW5kIGEgbWFwIFxuICogXG4gKiBQbGF0Zm9ybSBkZXBlbmRlbnQgZnVuY3Rpb25zIG1hcmtlZCB3aXRoICAgKiBAcGxhdGZvcm1EZXBlbmRlbnQgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemUge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107IC8vcGlja3VwIHtsYXQsIGxuZ30gXG4gICAgICAgIHRoaXMuaXNNYXBMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nbWFwc19rZXkgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9tYXBzX2tleSkgPT0gJ3VuZGVmaW5lZCcgPyAgJycgOiBzaGlwdGltaXplX21hcHNfa2V5IDtcbiAgICAgICAgdGhpcy5vcGVuTWFwTWFya2VySWNvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsOyAvLyBwbGF0Zm9ybSBkZXBlbmRlbnQgXG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG5ldyBXb29Db21tZXJjZSh0aGlzLmFqYXhfdXJsKTtcblxuICAgICAgICB0aGlzLm1hcCA9IHRoaXMuZ21hcHNfa2V5ID8gbmV3IEdvb2dsZU1hcCh0aGlzLmdtYXBzX2tleSkgOiBuZXcgT3BlblN0cmVldE1hcCgpO1xuICAgICAgICB0aGlzLnBsYXRmb3JtLmlzQ2hlY2tvdXQoKTsgXG4gICAgICAgIHRoaXMubWFwLmdyYW50UmVhZHkoKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogU2hvdyB0aGUgbWFwIHRvIHRoZSB1c2VyIFxuICAgICAqL1xuICAgIHNob3dNYXAoKSB7XG4gICAgICAgIHRoaXMudXNlclNjcm9sbCA9IGpRdWVyeSgnaHRtbCxib2R5Jykuc2Nyb2xsVG9wKCk7IFxuICAgICAgICBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCgwKTsgXG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cFwiKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEhpZGUgdGhlIG1hcCAgIFxuICAgICAqL1xuICAgIGhpZGVNYXAoKSB7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cFwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKS5oaWRlKCk7XG4gICAgICAgIGpRdWVyeSgnaHRtbCxib2R5Jykuc2Nyb2xsVG9wKHRoaXMudXNlclNjcm9sbCk7IFxuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXJNYXJrZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEdlbmVyYXRlIHRoZSBpbnB1dHMgZm9yIHRoZSB1c2VyIHRvIGFwcGVuZCBleHRyYSBpbmZvIGlmIG5lY2Vzc2FyeSBcbiAgICAgKiBUaGUgaWQgb2YgdGhlc2UgZmllbGRzIGlzIGluIHRoZSBmb3JtYXQgc2hpcHRpbWl6ZV9leHRyYV97UG9pbnRJZH1fe0ZpZWxkSWR9XG4gICAgICovXG4gICAgZ2V0RXh0ZW5kZWRJbmZvSHRtbChwaWNrdXBQb2ludCkge1xuICAgICAgICBpZiAoIXBpY2t1cFBvaW50LkV4dGVuZGVkSW5mbyB8fCB0eXBlb2YocGlja3VwUG9pbnQuRXh0ZW5kZWRJbmZvLmxlbmd0aCkgPT0ndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8gJiYgeCA8IHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mby5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgbGV0IGV4dHJhSW5mbyA9IHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mb1t4XTtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzaGlwdGltaXplLXBpY2t1cF9fZXh0ZW5kZWRcIj4nICtcbiAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX2V4dGVuZGVkX2xhYmVsIFwiPicgKyBleHRyYUluZm8uVGVrc3QgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNoaXB0aW1pemVfcGlja3VwX2V4dGVuZGVkX3ZhbHVlXCIgdmFsdWU9XCJcIiBpZD1cInNoaXB0aW1pemVfZXh0cmFfJyArIHBpY2t1cFBvaW50LlBvaW50SWQgKyAnXycgKyBleHRyYUluZm8uRmllbGRJZCArICdcIi8+ICcgK1xuICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzaGlwdGltaXplX3BpY2t1cF9leHRlbmRlZF9pZFwiIGlkPVwic2hpcHRpbWl6ZV9waWNrdXBcIiB2YWx1ZT1cIicgKyBleHRyYUluZm8uRmllbGRJZCArICdcIi8+ICcgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICovXG4gICAgc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKGlkeCkge1xuICAgICAgICBqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddXCIpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgIHRoaXMubWFwLnNlbGVjdE1hcmtlckJ5SWR4KGlkeCk7XG5cbiAgICAgICAgalF1ZXJ5KGpRdWVyeShcImlucHV0W25hbWU9J3NoaXB0aW1pemVfX3BvaW50J11cIikuZ2V0KGlkeCkpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHZhbGlkYXRlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBzZWxlY3RGcm9tTGlzdCgpIHtcbiAgICAgICAgbGV0IGlkeCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXB0aW1pemVfX3BvaW50J106Y2hlY2tlZFwiKS52YWwoKTtcbiAgICAgICAgbGV0IHBpY2t1cCA9IHRoaXMucGlja3VwUG9pbnRzW2lkeF07XG4gICAgICAgIGxldCBleHRyYSA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwaWNrdXAuRXh0ZW5kZWRJbmZvICYmIGkgPCBwaWNrdXAuRXh0ZW5kZWRJbmZvLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBleHRyYSArPSBcIjxici8+XCIgKyBwaWNrdXAuRXh0ZW5kZWRJbmZvW2ldLlRla3N0ICsgJzogJyArIGpRdWVyeShcIiNzaGlwdGltaXplX2V4dHJhX1wiICsgcGlja3VwLlBvaW50SWQgKyBcIl9cIiArIHBpY2t1cC5FeHRlbmRlZEluZm9baV0uRmllbGRJZCkudmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICsgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzICsgXCIgXCIgKyBleHRyYSk7XG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybS5zZXRQaWNrdXBQb2ludChwaWNrdXApO1xuICAgICAgICB0aGlzLmhpZGVNYXAoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiAgUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiAyIChsYXQsbG5nKSBwb2ludHMgaW4ga21zIFxuICAgICAqL1xuICAgIGdldERpc3RhbmNlKGxhdGxuZywgbGF0bG5nMikge1xuXG4gICAgICAgIHZhciBSID0gNjM3MWUzOyAvLyBtZXRyZXNcbiAgICAgICAgdmFyIM+GMSA9IGxhdGxuZy5sYXQoKS50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM+GMiA9IGxhdGxuZzIubG5nKCkudG9SYWRpYW5zKCk7XG5cbiAgICAgICAgdmFyIM6Uz4YgPSAobGF0bG4yLmxhdCgpIC0gbGF0bG5nLmxuZygpKS50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM6UzrsgPSAobGF0bG4yLmxuZygpIC0gbGF0bG5nLmxvbigpKS50b1JhZGlhbnMoKTtcblxuICAgICAgICB2YXIgYSA9IE1hdGguc2luKM6Uz4YgLyAyKSAqIE1hdGguc2luKM6Uz4YgLyAyKSArXG4gICAgICAgICAgICBNYXRoLmNvcyjPhjEpICogTWF0aC5jb3Moz4YyKSAqXG4gICAgICAgICAgICBNYXRoLnNpbijOlM67IC8gMikgKiBNYXRoLnNpbijOlM67IC8gMik7XG4gICAgICAgIHZhciBjID0gMiAqIE1hdGguYXRhbjIoTWF0aC5zcXJ0KGEpLCBNYXRoLnNxcnQoMSAtIGEpKTtcblxuICAgICAgICB2YXIgZCA9IE1hdGguZmxvb3IoUiAqIGMgLyAxMDAwKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogU2hvdyB0aGUgbWFwIGFuZCBxdWVyeSB0aGUgc2VydmVyIGZvciBwaWNrdXAgbG9jYXRpb25zIG5lYXIgdGhlIHNoaXBwaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGNsaWVudFxuICAgICAqIGNlbnRlciB0aGUgbWFwIG9uIHRoZSBmaXJzdCBwb2ludCBcbiAgICAgKiByZW1vdmUgb2xkIG1hcmtlcnMgXG4gICAgICogYWRkIHRoZSBuZXcgbWFya2VycyAgXG4gICAgICovXG4gICAgZ2V0UGlja3VwTG9jYXRpb25zKGV2dCkge1xuICAgICAgICBpZighdGhpcy5tYXAgfHwgIXRoaXMubWFwLmlzU2NyaXB0TG9hZGVkKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwIGlzIG5vdCBsb2FkZWQgLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waWNrdXBQb2ludHNMb2FkU3RhcnQoKTsgXG5cbiAgICAgICAgLyoqIGJlY2F1c2Ugc29tZSB2ZXJzaW9uIG9mIHdvbyB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIGNoZWNrb3V0IGFuZCBmaW5pc2ggIHRoZSBvcmRlciAqKi9cbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2hvd01hcCgpO1xuXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5wbGF0Zm9ybS5nZXRTaGlwcGluZ0RhdGEoKTtcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnc2hpcHRpbWl6ZV9waWNrdXBfbG9jYXRpb25zJztcblxuICAgICAgICB0aGlzLm1hcC5zZXRDYXJyaWVySWNvbihkYXRhLkNhcnJpZXJJZCk7XG5cbiAgICAgICAgdGhpcy5tYXAuZ2VvY29kZShkYXRhLCAoZ2VvY29kZSkgPT4geyB0aGlzLmdldFBpY2t1cExvY2F0aW9uc0Zyb21HZW9jb2RlZEFkZHIoZ2VvY29kZSwgZGF0YSk7IH0pO1xuICAgIH1cblxuXG4gICAgZ2V0UGlja3VwTG9jYXRpb25zRnJvbUdlb2NvZGVkQWRkcihnZW9jb2RlLCBkYXRhKSB7XG4gICAgICAgIHRoaXMucmVzZXRVSSgpOyBcbiAgICAgICAgXG4gICAgICAgIGlmKCFnZW9jb2RlLmxuZyB8fCAhZ2VvY29kZS5sYXQpIHtcbiAgICAgICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0b3AoKTsgXG4gICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfZ2VvbG9jYXRpb25mYWlsZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5BZGRyZXNzLkNvdW50cnkgPSBnZW9jb2RlLmlzbzI7XG4gICAgICAgIGRhdGEuQWRkcmVzcy5Mb25nID0gZ2VvY29kZS5sbmc7XG4gICAgICAgIGRhdGEuQWRkcmVzcy5MYXQgPSBnZW9jb2RlLmxhdDtcblxuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coZ2VvY29kZSk7XG5cbiAgICAgICAgalF1ZXJ5LmdldEpTT04odGhpcy5hamF4X3VybCwgZGF0YSwgKHBpY2t1cFBvaW50cykgPT4ge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgcG9pbnRzIHJlbW92ZSB0aGUgbG9hZGVyIFxuICAgICAgICAgICAgdGhpcy5waWNrdXBQb2ludHNMb2FkU3RvcCgpOyBcblxuICAgICAgICAgICAgaWYgKHBpY2t1cFBvaW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibm8gcGlja3VwIHBvaW50cyBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzIFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpY2t1cFBvaW50cyk7XG4gICAgICAgICAgICBpZiAocGlja3VwUG9pbnRzLkVycm9yLklkID09IDAgJiYgcGlja3VwUG9pbnRzLlBvaW50Lmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19vcHRpb25zLC5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLnNob3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBpY2t1cExvY2F0aW9ucyhwaWNrdXBQb2ludHMuUG9pbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSBhcGkgcmV0dXJuZWQgYW4gZXJyb3I6IFwiLCBwaWNrdXBQb2ludHMuRXJyb3IpOyAvL3BpY2t1cFBvaW50cy5FcnJvci5JbmZvIHx8IFxuICAgICAgICAgICAgICAgIHRoaXMucGlja3VwRXJyb3Ioc2hpcHRpbWl6ZV9ub19wb2ludHNfZm91bmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pLmZhaWwoIChyZXNwKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGdldHRpbmcgcG9pbnRzLCBzaGlwdGltaXplIGFwaSBlcnJvcj8gcmVwb3J0IHRvIHNoaXB0aW1pemUuIFwiLCByZXNwLnJlc3BvbnNlVGV4dCk7IC8vcGlja3VwUG9pbnRzLkVycm9yLkluZm8gfHwgXG4gICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfbm9fcG9pbnRzX2ZvdW5kKTsgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc2V0VUkoKXtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKS5oaWRlKCk7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyTWFya2VycygpOyBcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIHN0cmluZyBpbmZvIC0gdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBcbiAgICAgKi9cbiAgICBwaWNrdXBFcnJvcihpbmZvKSB7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gW107IFxuXG4gICAgICAgIGxldCBlRXJyb3IgPSBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Vycm9yXCIpO1xuICAgICAgICBlRXJyb3IuaHRtbChpbmZvKTtcbiAgICAgICAgZUVycm9yLnNob3coKTtcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX29wdGlvbnMsLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuaGlkZSgpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBcHBlbmQgdGhlIHBpY2t1cCBMb2NhdGlvbnMgdG8gdGhlIG1hcFxuICAgICAqIEBwYXJhbSBhcnJheSBwaWNrdXBQb2ludHMgLSBhbiBhcnJheSBvZiBhdmFpbGFibGUgcGlja3VwIHBvaW50cyBcbiAgICAgKi9cbiAgICBzZXRQaWNrdXBMb2NhdGlvbnMocGlja3VwUG9pbnRzKSB7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gcGlja3VwUG9pbnRzO1xuICAgICAgICB0aGlzLm1hcC5jbGVhck1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5tYXAuY2VudGVyTWFwKHRoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMV0uTG9uZyk7XG4gICAgICAgIHRoaXMubWFwLmFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCAoaWR4KSA9PiB7IHRoaXMuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKGlkeCk7IH0pO1xuICAgICAgICB0aGlzLnNldE9wdGlvbnNGb3JBZGRyZXNzKHBpY2t1cFBvaW50cyk7XG5cbiAgICAgICAgKHR5cGVvZih0aGlzLm1hcC5tYXAuaW52YWxpZGF0ZVNpemUpICE9ICd1bmRlZmluZWQnKSAmJiB0aGlzLm1hcC5tYXAuaW52YWxpZGF0ZVNpemUoKTtcblxuICAgICAgICBzZXRUaW1lb3V0ICggKCkgPT4geyBcbiAgICAgICAgICAgIHRoaXMubWFwLmZpdEJvdW5kcygpOyBcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIHBpY2t1cFBvaW50c1tdIC0gW10gb2YgcGlja3VwIHBvaW50cyByZXR1cm5lZCBieSB0aGUgYXBpIFxuICAgICAqL1xuICAgIHNldE9wdGlvbnNGb3JBZGRyZXNzKHBpY2t1cFBvaW50cykge1xuXG4gICAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGlja3VwUG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX3BvaW50XCI+JyArXG4gICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIicgKyBpICsgJ1wiIG5hbWU9XCJzaGlwdGltaXplX19wb2ludFwiICBvbmNsaWNrPVwic2hpcHRpbWl6ZS5zZWxlY3RQb2ludEZyb21MaXN0SW5NYXAoJyArIGkgKyAnKVwiLz4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzaGlwdGltaXplLXBpY2t1cF9fcG9pbnRfZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwic2hpcHRpbWl6ZS5zZWxlY3RQb2ludEZyb21MaXN0SW5NYXAoJyArIGkgKyAnKVwiPicgK1xuICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgKHBpY2t1cFBvaW50c1tpXS5JbmZvcm1hdGlvbi5OYW1lID9waWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uTmFtZSArICc8YnIvPicgOiAnJylcbiAgICAgICAgICAgICAgICAgKyBwaWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uQWRkcmVzcyArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRFeHRlbmRlZEluZm9IdG1sKHBpY2t1cFBvaW50c1tpXSkgK1xuICAgICAgICAgICAgICAgICc8L3NwYW4+J1xuXG4gICAgICAgICAgICAgICAgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGh0bWwpO1xuXG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fb3RoZXJcIikuaHRtbChodG1sKTtcbiAgICB9XG5cblxuICAgIGxvYWRNYXAoKSB7XG4gICAgICAgIHRoaXMubWFwLmxvYWRNYXAoKTtcbiAgICB9XG5cbiAgICBwaWNrdXBQb2ludHNMb2FkU3RhcnQoKSB7XG4gICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFdyYXBwZXJcIikuYWRkQ2xhc3MoJ2xvYWRpbmcnKTsgIFxuICAgIH07IFxuXG4gICAgcGlja3VwUG9pbnRzTG9hZFN0b3AoKSB7XG4gICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFdyYXBwZXJcIikucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTsgXG4gICAgfTtcbn1cblxualF1ZXJ5KGZ1bmN0aW9uKCkge1xuICAgIGlmKHR5cGVvZih3b29jb21tZXJjZV9wYXJhbXMpICE9ICd1bmRlZmluZWQnKXtcbiAgICAgICAgd2luZG93LnNoaXB0aW1pemUgPSBuZXcgU2hpcHRpbWl6ZSh3b29jb21tZXJjZV9wYXJhbXMuYWpheF91cmwpOyAgICBcbiAgICB9IFxufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUuc2Nzcz9lYzk3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvbGVhZmxldC5jc3M/OTU1NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Woocommerce = function () {\n    function Woocommerce(ajax_url) {\n        _classCallCheck(this, Woocommerce);\n\n        this.ajax_url = ajax_url;\n    }\n\n    /** \n     * @return true if this is the checkout page \n     */\n\n\n    _createClass(Woocommerce, [{\n        key: 'isCheckout',\n        value: function isCheckout() {\n            return jQuery(\"body\").hasClass('woocommerce-checkout');\n        }\n\n        /* \n         * If there is only one method available woo will use a hidden field for the selected carrier \n         *  + Generic Methods do not have an instance id \n         */\n\n    }, {\n        key: 'getShippingMethodId',\n        value: function getShippingMethodId() {\n\n            var eCheckbox = jQuery(\"input[name='shipping_method[0]']:checked\");\n            var eHidden = jQuery(\"input[name='shipping_method[0]']\");\n\n            var shippingMethod = eCheckbox.length > 0 ? eCheckbox.val() : eHidden.val();\n\n            if (shippingMethod.indexOf(':') > 0) {\n                var method_parts = shippingMethod.split(':');\n                return _shiptimizeUtils2.default.removeNonNumeric(method_parts[0]);\n            } else {\n                return shippingMethod;\n            }\n        }\n\n        /** \n         * Wordpress won't send session cookies to wp-admin and the session handling in woocommerce is so poorly documented we are better off \n         * extracting necessary info client side our selves. We're emulating their checkout.js \n         * @return an object containing address parts \n         */\n\n    }, {\n        key: 'getShippingData',\n        value: function getShippingData() {\n\n            var country = jQuery('#billing_country').val(),\n                state = jQuery('#billing_state').val(),\n                postcode = jQuery('input#billing_postcode').val(),\n                city = jQuery('#billing_city').val(),\n                address = jQuery('input#billing_address_1').val(),\n                address_2 = jQuery('input#billing_address_2').val(),\n                s_country = country,\n                s_state = state,\n                s_postcode = postcode,\n                s_city = city,\n                s_address = address,\n                s_address_2 = address_2;\n\n            if (jQuery('#ship-to-different-address').find('input').is(':checked')) {\n                s_country = jQuery('#shipping_country').val();\n                s_state = jQuery('#shipping_state').val();\n                s_postcode = jQuery('input#shipping_postcode').val();\n                s_city = jQuery('#shipping_city').val();\n                s_address = jQuery('input#shipping_address_1').val();\n                s_address_2 = jQuery('input#shipping_address_2').val();\n            }\n\n            return {\n                \"Address\": {\n                    \"Lat\": \"\",\n                    \"Long\": \"\",\n                    \"Streetname1\": s_address,\n                    \"Streetname2\": s_address_2,\n                    \"HouseNumber\": '',\n                    \"NumberExtension\": '',\n                    \"PostalCode\": s_postcode,\n                    \"s_postcode\": s_postcode,\n                    \"City\": s_city,\n                    \"Country\": s_country,\n                    \"State\": s_state\n\n                },\n                post_data: jQuery('form.checkout').serialize(),\n                \"CarrierId\": this.carrier_id\n            };\n        }\n\n        /** \n         * We must run this onload \n         * And on method change \n         * because people may never change the carrier or select a pickup point \n         */\n\n    }, {\n        key: 'setCarrier',\n        value: function setCarrier(carrier_id) {\n            this.carrier_id = typeof carrier_id != 'undefined' ? carrier_id : this.getShippingMethodId();\n            jQuery(\"#shipping_carrier_id\").val(this.carrier_id);\n        }\n\n        /** \n         * @param Pickup pickup \n         */\n\n    }, {\n        key: 'setPickupPoint',\n        value: function setPickupPoint(pickup) {\n            var pickup_label = pickup.Information.Name + \" \" + pickup.Information.Address;\n\n            jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup_label);\n            jQuery(\"#shipping_pickup_id\").val(pickup.PointId);\n            jQuery(\"#shipping_pickup_label\").val(pickup_label);\n\n            jQuery(\"#shiptimizepickup\").val(pickup.PointId);\n        }\n    }]);\n\n    return Woocommerce;\n}();\n\nexports.default = Woocommerce;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcz8yY2Y5Il0sIm5hbWVzIjpbIldvb2NvbW1lcmNlIiwiYWpheF91cmwiLCJqUXVlcnkiLCJoYXNDbGFzcyIsImVDaGVja2JveCIsImVIaWRkZW4iLCJzaGlwcGluZ01ldGhvZCIsImxlbmd0aCIsInZhbCIsImluZGV4T2YiLCJtZXRob2RfcGFydHMiLCJzcGxpdCIsIlV0aWxzIiwicmVtb3ZlTm9uTnVtZXJpYyIsImNvdW50cnkiLCJzdGF0ZSIsInBvc3Rjb2RlIiwiY2l0eSIsImFkZHJlc3MiLCJhZGRyZXNzXzIiLCJzX2NvdW50cnkiLCJzX3N0YXRlIiwic19wb3N0Y29kZSIsInNfY2l0eSIsInNfYWRkcmVzcyIsInNfYWRkcmVzc18yIiwiZmluZCIsImlzIiwicG9zdF9kYXRhIiwic2VyaWFsaXplIiwiY2Fycmllcl9pZCIsImdldFNoaXBwaW5nTWV0aG9kSWQiLCJwaWNrdXAiLCJwaWNrdXBfbGFiZWwiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwiaHRtbCIsInNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwIiwiUG9pbnRJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLFc7QUFFakIseUJBQVlDLFFBQVosRUFBc0I7QUFBQTs7QUFDbEIsYUFBS0EsUUFBTCxHQUFnQkEsUUFBaEI7QUFDSDs7QUFFRDs7Ozs7OztxQ0FHYTtBQUNULG1CQUFPQyxPQUFPLE1BQVAsRUFBZUMsUUFBZixDQUF3QixzQkFBeEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7OzhDQUlxQjs7QUFFakIsZ0JBQUlDLFlBQVlGLE9BQU8sMENBQVAsQ0FBaEI7QUFDQSxnQkFBSUcsVUFBVUgsT0FBTyxrQ0FBUCxDQUFkOztBQUVBLGdCQUFJSSxpQkFBa0JGLFVBQVVHLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUJILFVBQVVJLEdBQVYsRUFBdkIsR0FBeUNILFFBQVFHLEdBQVIs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Ozs7a0JBMUdnQnZDLFciLCJmaWxlIjoiNC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vY29tbWVyY2Uge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgY2hlY2tvdXQgcGFnZSBcbiAgICAgKi9cbiAgICBpc0NoZWNrb3V0KCkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KFwiYm9keVwiKS5oYXNDbGFzcygnd29vY29tbWVyY2UtY2hlY2tvdXQnKTtcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgYXZhaWxhYmxlIHdvbyB3aWxsIHVzZSBhIGhpZGRlbiBmaWVsZCBmb3IgdGhlIHNlbGVjdGVkIGNhcnJpZXIgXG4gICAgICogICsgR2VuZXJpYyBNZXRob2RzIGRvIG5vdCBoYXZlIGFuIGluc3RhbmNlIGlkIFxuICAgICAqLyBcbiAgICBnZXRTaGlwcGluZ01ldGhvZElkKCl7XG5cbiAgICAgICAgbGV0IGVDaGVja2JveCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddOmNoZWNrZWRcIik7IFxuICAgICAgICBsZXQgZUhpZGRlbiA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddXCIpOyBcblxuICAgICAgICBsZXQgc2hpcHBpbmdNZXRob2QgPSAgZUNoZWNrYm94Lmxlbmd0aCA+IDAgPyBlQ2hlY2tib3gudmFsKCkgOiBlSGlkZGVuLnZhbCgpIDsgXG5cbiAgICAgICAgaWYgKCBzaGlwcGluZ01ldGhvZC5pbmRleE9mKCc6JykgPiAwICl7XG4gICAgICAgICAgICB2YXIgbWV0aG9kX3BhcnRzID0gc2hpcHBpbmdNZXRob2Quc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5yZW1vdmVOb25OdW1lcmljKG1ldGhvZF9wYXJ0c1swXSk7ICAgICBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIFxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gc2hpcHBpbmdNZXRob2Q7XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdvcmRwcmVzcyB3b24ndCBzZW5kIHNlc3Npb24gY29va2llcyB0byB3cC1hZG1pbiBhbmQgdGhlIHNlc3Npb24gaGFuZGxpbmcgaW4gd29vY29tbWVyY2UgaXMgc28gcG9vcmx5IGRvY3VtZW50ZWQgd2UgYXJlIGJldHRlciBvZmYgXG4gICAgICogZXh0cmFjdGluZyBuZWNlc3NhcnkgaW5mbyBjbGllbnQgc2lkZSBvdXIgc2VsdmVzLiBXZSdyZSBlbXVsYXRpbmcgdGhlaXIgY2hlY2tvdXQuanMgXG4gICAgICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzIHBhcnRzIFxuICAgICAqL1xuICAgIGdldFNoaXBwaW5nRGF0YSgpIHtcblxuICAgICAgICB2YXIgY291bnRyeSA9IGpRdWVyeSgnI2JpbGxpbmdfY291bnRyeScpLnZhbCgpLFxuICAgICAgICAgICAgc3RhdGUgPSBqUXVlcnkoJyNiaWxsaW5nX3N0YXRlJykudmFsKCksXG4gICAgICAgICAgICBwb3N0Y29kZSA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19wb3N0Y29kZScpLnZhbCgpLFxuICAgICAgICAgICAgY2l0eSA9IGpRdWVyeSgnI2JpbGxpbmdfY2l0eScpLnZhbCgpLFxuICAgICAgICAgICAgYWRkcmVzcyA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzEnKS52YWwoKSxcbiAgICAgICAgICAgIGFkZHJlc3NfMiA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzInKS52YWwoKSxcbiAgICAgICAgICAgIHNfY291bnRyeSA9IGNvdW50cnksXG4gICAgICAgICAgICBzX3N0YXRlID0gc3RhdGUsXG4gICAgICAgICAgICBzX3Bvc3Rjb2RlID0gcG9zdGNvZGUsXG4gICAgICAgICAgICBzX2NpdHkgPSBjaXR5LFxuICAgICAgICAgICAgc19hZGRyZXNzID0gYWRkcmVzcyxcbiAgICAgICAgICAgIHNfYWRkcmVzc18yID0gYWRkcmVzc18yO1xuXG5cbiAgICAgICAgaWYgKGpRdWVyeSgnI3NoaXAtdG8tZGlmZmVyZW50LWFkZHJlc3MnKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBzX2NvdW50cnkgPSBqUXVlcnkoJyNzaGlwcGluZ19jb3VudHJ5JykudmFsKCk7XG4gICAgICAgICAgICBzX3N0YXRlID0galF1ZXJ5KCcjc2hpcHBpbmdfc3RhdGUnKS52YWwoKTtcbiAgICAgICAgICAgIHNfcG9zdGNvZGUgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX3Bvc3Rjb2RlJykudmFsKCk7XG4gICAgICAgICAgICBzX2NpdHkgPSBqUXVlcnkoJyNzaGlwcGluZ19jaXR5JykudmFsKCk7XG4gICAgICAgICAgICBzX2FkZHJlc3MgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMScpLnZhbCgpO1xuICAgICAgICAgICAgc19hZGRyZXNzXzIgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMicpLnZhbCgpO1xuICAgICAgICB9XG4gXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcIkFkZHJlc3NcIjp7XG4gICAgICAgICAgICAgICAgXCJMYXRcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIkxvbmdcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUxXCI6IHNfYWRkcmVzcyxcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUyXCI6IHNfYWRkcmVzc18yLFxuICAgICAgICAgICAgICAgIFwiSG91c2VOdW1iZXJcIjogJycsXG4gICAgICAgICAgICAgICAgXCJOdW1iZXJFeHRlbnNpb25cIjogJycsXG4gICAgICAgICAgICAgICAgXCJQb3N0YWxDb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJzX3Bvc3Rjb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJDaXR5XCI6IHNfY2l0eSxcbiAgICAgICAgICAgICAgICBcIkNvdW50cnlcIjogc19jb3VudHJ5LFxuICAgICAgICAgICAgICAgIFwiU3RhdGVcIjogc19zdGF0ZSxcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RfZGF0YTogalF1ZXJ5KCdmb3JtLmNoZWNrb3V0Jykuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBcIkNhcnJpZXJJZFwiOiB0aGlzLmNhcnJpZXJfaWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2UgbXVzdCBydW4gdGhpcyBvbmxvYWQgXG4gICAgICogQW5kIG9uIG1ldGhvZCBjaGFuZ2UgXG4gICAgICogYmVjYXVzZSBwZW9wbGUgbWF5IG5ldmVyIGNoYW5nZSB0aGUgY2FycmllciBvciBzZWxlY3QgYSBwaWNrdXAgcG9pbnQgXG4gICAgICovIFxuICAgIHNldENhcnJpZXIoY2Fycmllcl9pZCl7XG4gICAgICAgIHRoaXMuY2Fycmllcl9pZCA9IHR5cGVvZihjYXJyaWVyX2lkKSAhPSAndW5kZWZpbmVkJyA/IGNhcnJpZXJfaWQgOiB0aGlzLmdldFNoaXBwaW5nTWV0aG9kSWQoKTsgIFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfY2Fycmllcl9pZFwiKS52YWwodGhpcy5jYXJyaWVyX2lkKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIFBpY2t1cCBwaWNrdXAgXG4gICAgICovXG4gICAgc2V0UGlja3VwUG9pbnQocGlja3VwKSB7XG4gICAgICAgIGxldCBwaWNrdXBfbGFiZWwgPSAgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzOyBcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICtwaWNrdXBfbGFiZWwpO1xuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfcGlja3VwX2lkXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwcGluZ19waWNrdXBfbGFiZWxcIikudmFsKHBpY2t1cF9sYWJlbCk7IFxuXG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplcGlja3VwXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7IFxuICAgICAgICBcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeGmaps = function () {\n    function ShiptimizeGmaps(key) {\n        _classCallCheck(this, ShiptimizeGmaps);\n\n        this.isScriptLoaded = false;\n        this.markers = [];\n        this.map = null;\n        this.pickupPoints = [];\n        this.key = key;\n\n        /** \n         * the root url for the icons it's different for every platform  \n         * make sure to include a trailing / \n         */\n        this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n        this.icon_selected = this.icon_folder + 'selected.png';\n        this.icon_default = this.icon_folder + 'default.png';\n        this.current_icon = this.icon_default;\n    }\n\n    /** \n     * Checks if we have an icon for this carrier.\n     * If yes then change the carrier icon\n     * If not then use the default icon\n     * \n     * @param int carrier_id - the carrier id \n     */\n\n\n    _createClass(ShiptimizeGmaps, [{\n        key: 'setCarrierIcon',\n        value: function setCarrierIcon(carrier_id) {\n            var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n            //this.current_icon = Utils.isUrlValid(carrier_icon_url) ?  carrier_icon_url : this.icon_default; \n            this.current_icon = carrier_icon_url;\n        }\n\n        /** \n         * if the script has not been loaded , load it \n         */\n\n    }, {\n        key: 'grantReady',\n        value: function grantReady() {\n            if (!this.isScriptLoaded) {\n                this.loadScript();\n            }\n        }\n    }, {\n        key: 'loadScript',\n        value: function loadScript() {\n            _shiptimizeUtils2.default.injectExternalScript(\"https://maps.googleapis.com/maps/api/js?key=\" + this.key + \"&callback=shiptimize.loadMap\");\n            this.isScriptLoaded = true;\n        }\n\n        /** \n         * Load the map into the element \n         * This function needs the script to be loaded \n         */\n\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            console.log(\"displaying map on container with \" + jQuery(\".shiptimize-pickup__map\").width() + \" \" + jQuery(\".shiptimize-pickup__map\").height(), jQuery(\".shiptimize-pickup__map\").get(0));\n            this.map = new google.maps.Map(jQuery(\".shiptimize-pickup__map\").get(0), {\n                center: { lat: -34.397, lng: 150.644 },\n                zoom: 16,\n                mapTypeControl: false\n            });\n        }\n\n        /** \n         * center the map \n         */\n\n    }, {\n        key: 'centerMap',\n        value: function centerMap(lat, lng) {\n            this.map.setCenter(new google.maps.LatLng(lat, lng));\n        }\n\n        /** \n         * Extract the country code from a geocode result\n         * @param geocode - a google.maps.Geocoder result \n         * @return string alpha-2 code for the country name \n         */\n\n    }, {\n        key: 'getCountryCodeFromResult',\n        value: function getCountryCodeFromResult(geocode) {\n            if (typeof geocode.address_components == \"undefined\") {\n                return \"\";\n            }\n\n            var components = geocode.address_components;\n            for (var i = 0; i < components.length; ++i) {\n                var types = components[i].types;\n\n                for (var j = 0; j < types.length; ++j) {\n                    if (types[j] == 'country') {\n                        return components[i].short_name;\n                    }\n                }\n            }\n        }\n\n        /**\n         *  \n         * @param shippingData, the address parts       \n         * @param f_callback , the function to call when all mighty google returns a result \n         */\n\n    }, {\n        key: 'geocode',\n        value: function geocode(shippingData, f_callback) {\n            var _this = this;\n\n            if (typeof google == 'undefined') {\n                //script not loaded yet\n                setTimeout(function () {\n                    _this.geocode(shippingData, f_callback);\n                }, 200);\n                return;\n            }\n\n            var geocoder = new google.maps.Geocoder();\n            var me = this;\n\n            var address = shippingData.Address.Streetname1 + \" \" + shippingData.Address.Streetname2 + \" \" + shippingData.Address.postalCode + \" \" + shippingData.Address.City + \" \" + shippingData.Address.State + \" \" + shippingData.Address.Country;\n            console.log('geocoding ' + address);\n\n            geocoder.geocode({ 'address': address }, function (results, status) {\n                var geocode = { iso2: '', lat: '', lng: '' };\n\n                if (status == 'OK') {\n                    geocode = results[0];\n                } else {\n                    console.log('Geocode was not successful for the following reason: ' + status);\n                    f_callback(geocode);\n                    return;\n                }\n\n                var latlng = geocode.geometry.location;\n\n                geocode.iso2 = me.getCountryCodeFromResult(geocode);\n                geocode.lat = latlng.lat();\n                geocode.lng = latlng.lng();\n\n                f_callback(geocode);\n            });\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            if (this.markers.length > 0) {\n                for (var i = 0; i < this.markers.length; ++i) {\n                    this.markers[i].setMap(null);\n                }\n\n                this.markers = [];\n            }\n        }\n\n        /** \n         * Add the markers to map \n         * @param array pickupPoints - an array of pickupPoints\n         * @param callback - a function to call when the marker is clicked \n         */\n\n    }, {\n        key: 'addMarkers',\n        value: function addMarkers(pickupPoints, callback) {\n            var _this2 = this;\n\n            this.pickupPoints = pickupPoints;\n\n            var _loop = function _loop(x) {\n                _this2.markers[x] = _this2.getMarker(pickupPoints[x]);\n                //    we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n                pickupPoints[x].marker = _this2.markers[x];\n\n                _this2.markers[x].addListener('click', function () {\n                    if (typeof callback != 'undefined') {\n                        callback(x);\n                    }\n                });\n            };\n\n            for (var x = 0; x < pickupPoints.length; ++x) {\n                _loop(x);\n            }\n\n            this.fitBounds();\n        }\n\n        /** \n         * Return a marker for the gmaps \n         */\n\n    }, {\n        key: 'getMarker',\n        value: function getMarker(pickupPoint, callback) {\n            var marker = new google.maps.Marker({\n                position: new google.maps.LatLng(pickupPoint.Lat, pickupPoint.Long),\n                map: this.map,\n                icon: {\n                    url: this.current_icon,\n                    scaledSize: new google.maps.Size(50, 50), // scaled size\n                    origin: new google.maps.Point(0, 0), // origin\n                    anchor: new google.maps.Point(0, 0) // anchor\n                }\n            });\n\n            return marker;\n        }\n    }, {\n        key: 'fitBounds',\n        value: function fitBounds() {\n            var bounds = new google.maps.LatLngBounds();\n            for (var x = 0; x < this.markers.length; ++x) {\n                bounds.extend(this.markers[x].getPosition());\n            }\n            this.map.fitBounds(bounds);\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         * @param int idx - the index to select \n         */\n\n    }, {\n        key: 'selectMarkerByIdx',\n        value: function selectMarkerByIdx(idx) {\n            var selected = {\n                url: this.icon_selected,\n                scaledSize: new google.maps.Size(50, 50), // scaled size\n                origin: new google.maps.Point(0, 0), // origin\n                anchor: new google.maps.Point(0, 0) // anchor\n            };\n            var curr = {\n                url: this.current_icon,\n                scaledSize: new google.maps.Size(50, 50), // scaled size\n                origin: new google.maps.Point(0, 0), // origin\n                anchor: new google.maps.Point(0, 0) // anchor\n            };\n\n            for (var i = 0; i < this.markers.length; ++i) {\n                this.markers[i].setIcon(idx == i ? selected : curr);\n            }\n        }\n    }]);\n\n    return ShiptimizeGmaps;\n}();\n\nexports.default = ShiptimizeGmaps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzPzBiZjEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZUdtYXBzIiwia2V5IiwiaXNTY3JpcHRMb2FkZWQiLCJtYXJrZXJzIiwibWFwIiwicGlja3VwUG9pbnRzIiwiaWNvbl9mb2xkZXIiLCJzaGlwdGltaXplX2ljb25fZm9sZGVyIiwiaWNvbl9zZWxlY3RlZCIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImNhcnJpZXJfaWQiLCJjYXJyaWVyX2ljb25fdXJsIiwibG9hZFNjcmlwdCIsIlV0aWxzIiwiaW5qZWN0RXh0ZXJuYWxTY3JpcHQiLCJjb25zb2xlIiwibG9nIiwialF1ZXJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXQiLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiY2VudGVyIiwibGF0IiwibG5nIiwiem9vbSIsIm1hcFR5cGVDb250cm9sIiwic2V0Q2VudGVyIiwiTGF0TG5nIiwiZ2VvY29kZSIsImFkZHJlc3NfY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJpIiwibGVuZ3RoIiwidHlwZXMiLCJqIiwic2hvcnRfbmFtZSIsInNoaXBwaW5nRGF0YSIsImZfY2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiZ2VvY29kZXIiLCJHZW9jb2RlciIsIm1lIiwiYWRkcmVzcyIsIkFkZHJlc3MiLCJTdHJlZXRuYW1lMSIsIlN0cmVldG5hbWUyIiwicG9zdGFsQ29kZSIsIkNpdHkiLCJTdGF0ZSIsIkNvdW50cnkiLCJyZXN1bHRzIiwic3RhdHVzIiwiaXNvMiIsImxhdGxuZyIsImdlb21ldHJ5IiwibG9jYXRpb24iLCJnZXRDb3VudHJ5Q29kZUZyb21SZXN1bHQiLCJzZXRNYXAiLCJjYWxsYmFjayIsIngiLCJnZXRNYXJrZXIiLCJtYXJrZXIiLCJhZGRMaXN0ZW5lciIsImZpdEJvdW5kcyIsInBpY2t1cFBvaW50IiwiTWFya2VyIiwicG9zaXRpb24iLCJMYXQiLCJMb25nIiwiaWNvbiIsInVybCIsInNjYWxlZFNpemUiLCJTaXplIiwib3JpZ2luIiwiUG9pbnQiLCJhbmNob3IiLCJib3VuZHMiLCJMYXRMbmdCb3VuZHMiLCJleHRlbmQiLCJnZXRQb3NpdGlvbiIsImlkeCIsInNlbGVjdGVkIiwiY3VyciIsInNldEljb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxlO0FBRWpCLDZCQUFZQyxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7QUFDQSxhQUFLQyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsYUFBS0osR0FBTCxHQUFXQSxHQUFYOztBQUVBOzs7O0FBSUEsYUFBS0ssV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFpREEsc0JBQWpELEdBQTBFLEVBQTdGO0FBQ0EsYUFBS0MsYUFBTCxHQUFxQixLQUFLRixXQUFMLEdBQWlCLGNBQXRDO0FBQ0EsYUFBS0csWUFBTCxHQUFvQixLQUFLSCxXQUFMLEdBQWlCLGFBQXJDO0FBQ0EsYUFBS0ksWUFBTCxHQUFvQixLQUFLRCxZQUF6QjtBQUNIOztBQUdEOzs7Ozs7Ozs7Ozt1Q0FPZUUsVSxFQUFXO0FBQ3hCLGdCQUFJQyxtQkFBbUIsS0FBS04sV0FBTCxHQUFpQixFQUFqQixHQUFvQkssVUFBcEIsR0FBK0IsTUFBdEQ7QUFDQTtBQUNBLGlCQUFLRCxZQUFMLEdBQW9CRSxnQkFBcEI7QUFDRDs7QUFHRDs7Ozs7O3FDQUdhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLVixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLVyxVQUFMO0FBQ0g7QUFDSjs7O3FDQUVZO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQixpREFBaUQsS0FBS2QsR0FBdEQsR0FBNEQsOEJBQXZGO0FBQ0EsaUJBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7QUFFRDs7Ozs7OztrQ0FJVTtBQUNOYyxvQkFBUUMsR0FBUixDQUFZLHND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QUFJQyxXQUFXO0FBQ1BYLHFCQUFNLEtBQUtsRSxhQURKO0FBRVBtRSw0QkFBWSxJQUFJckQsT0FBT0MsSUFBUCxDQUFZcUQsSUFBaEIsQ0FBcUIsRUFBckIsRUFBeUIsRUFBekIsQ0FGTCxFQUVtQztBQUMxQ0Msd0JBQVEsSUFBSXZELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXdCLENBQXhCLENBSEQsRUFHNkI7QUFDcENDLHdCQUFRLElBQUl6RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF5QixDQUF6QixDQUpELENBSTZCO0FBSjdCLGFBQWY7QUFNQSxnQkFBSVEsT0FBTztBQUNIWixxQkFBTSxLQUFLaEUsWUFEUjtBQUVIaUUsNEJBQVksSUFBSXJELE9BQU9DLElBQVAsQ0FBWXFELElBQWhCLENBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLENBRlQsRUFFdUM7QUFDMUNDLHdCQUFRLElBQUl2RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF3QixDQUF4QixDQUhMLEVBR2lDO0FBQ3BDQyx3QkFBUSxJQUFJekQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FKTCxDQUlpQztBQUpqQyxhQUFYOztBQU9BLGlCQUFLLElBQUkzQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS2hDLE9BQUwsQ0FBYWlDLE1BQWpDLEVBQXlDLEVBQUVELENBQTNDLEVBQThDO0FBQzFDLHFCQUFLaEMsT0FBTCxDQUFhZ0MsQ0FBYixFQUFnQm9ELE9BQWhCLENBQ0VILE9BQU9qRCxDQUFQLEdBRUFrRCxRQUZBLEdBSUFDLElBTEY7QUFPSDtBQUNKOzs7Ozs7a0JBMU5nQnRGLGUiLCJmaWxlIjoiNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyAgXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVHbWFwcyB7XG5cbiAgICBjb25zdHJ1Y3RvcihrZXkpIHtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5tYXAgPSBudWxsO1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovIFxuICAgICAgICB0aGlzLmljb25fZm9sZGVyID0gdHlwZW9mKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIpICE9ICd1bmRlZmluZWQnID8gIHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgOiAnJzsgIFxuICAgICAgICB0aGlzLmljb25fc2VsZWN0ZWQgPSB0aGlzLmljb25fZm9sZGVyKydzZWxlY3RlZC5wbmcnO1xuICAgICAgICB0aGlzLmljb25fZGVmYXVsdCA9IHRoaXMuaWNvbl9mb2xkZXIrJ2RlZmF1bHQucG5nJztcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDsgXG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi8gXG4gICAgc2V0Q2Fycmllckljb24oY2Fycmllcl9pZCl7XG4gICAgICBsZXQgY2Fycmllcl9pY29uX3VybCA9IHRoaXMuaWNvbl9mb2xkZXIrJycrY2Fycmllcl9pZCsnLnBuZyc7IFxuICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyAgY2Fycmllcl9pY29uX3VybCA6IHRoaXMuaWNvbl9kZWZhdWx0OyBcbiAgICAgIHRoaXMuY3VycmVudF9pY29uID0gY2Fycmllcl9pY29uX3VybDtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0IFxuICAgICAqL1xuICAgIGdyYW50UmVhZHkoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkU2NyaXB0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkU2NyaXB0KCkge1xuICAgICAgICBVdGlscy5pbmplY3RFeHRlcm5hbFNjcmlwdChcImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9XCIgKyB0aGlzLmtleSArIFwiJmNhbGxiYWNrPXNoaXB0aW1pemUubG9hZE1hcFwiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExvYWQgdGhlIG1hcCBpbnRvIHRoZSBlbGVtZW50IFxuICAgICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHsgICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZyhcImRpc3BsYXlpbmcgbWFwIG9uIGNvbnRhaW5lciB3aXRoIFwiICsgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikud2lkdGgoKSArIFwiIFwiK2pRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmhlaWdodCgpICxqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCkpOyBcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmdldCgwKSwge1xuICAgICAgICAgICAgY2VudGVyOiB7IGxhdDogLTM0LjM5NywgbG5nOiAxNTAuNjQ0IH0sXG4gICAgICAgICAgICB6b29tOiAxNixcbiAgICAgICAgICAgIG1hcFR5cGVDb250cm9sOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIGNlbnRlciB0aGUgbWFwIFxuICAgICAqL1xuICAgIGNlbnRlck1hcChsYXQsIGxuZykge1xuICAgICAgICB0aGlzLm1hcC5zZXRDZW50ZXIobmV3IGdvb2dsZS5tYXBzLkxhdExuZyhsYXQsIGxuZykpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBFeHRyYWN0IHRoZSBjb3VudHJ5IGNvZGUgZnJvbSBhIGdlb2NvZGUgcmVzdWx0XG4gICAgICogQHBhcmFtIGdlb2NvZGUgLSBhIGdvb2dsZS5tYXBzLkdlb2NvZGVyIHJlc3VsdCBcbiAgICAgKiBAcmV0dXJuIHN0cmluZyBhbHBoYS0yIGNvZGUgZm9yIHRoZSBjb3VudHJ5IG5hbWUgXG4gICAgICovIFxuICAgIGdldENvdW50cnlDb2RlRnJvbVJlc3VsdChnZW9jb2RlKXtcbiAgICAgIGlmKHR5cGVvZihnZW9jb2RlLmFkZHJlc3NfY29tcG9uZW50cykgPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgICAgIHJldHVybiBcIlwiOyBcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbXBvbmVudHMgPSBnZW9jb2RlLmFkZHJlc3NfY29tcG9uZW50cztcbiAgICAgIGZvciggbGV0IGk9MDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyArK2kgKXtcbiAgICAgICAgbGV0IHR5cGVzID0gY29tcG9uZW50c1tpXS50eXBlczsgXG5cbiAgICAgICAgZm9yKGxldCBqPTA7IGogPCB0eXBlcy5sZW5ndGg7ICsraiApe1xuICAgICAgICAgIGlmKCB0eXBlc1tqXSA9PSAnY291bnRyeScpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzW2ldLnNob3J0X25hbWU7IFxuICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFxuICAgICAqIEBwYXJhbSBzaGlwcGluZ0RhdGEsIHRoZSBhZGRyZXNzIHBhcnRzICAgICAgIFxuICAgICAqIEBwYXJhbSBmX2NhbGxiYWNrICwgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgbWlnaHR5IGdvb2dsZSByZXR1cm5zIGEgcmVzdWx0IFxuICAgICAqLyBcbiAgICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgIGZfY2FsbGJhY2spIHsgXG4gICAgICBpZih0eXBlb2YoZ29vZ2xlKSA9PSAndW5kZWZpbmVkJyl7IC8vc2NyaXB0IG5vdCBsb2FkZWQgeWV0XG4gICAgICAgIHNldFRpbWVvdXQoKCk9Pnt0aGlzLmdlb2NvZGUoc2hpcHBpbmdEYXRhLCBmX2NhbGxiYWNrKTsgfSwgMjAwKTsgXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgICBsZXQgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcbiAgICAgICAgbGV0IG1lICA9IHRoaXM7IFxuXG4gICAgICAgIHZhciBhZGRyZXNzID0gc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlN0cmVldG5hbWUyICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5wb3N0YWxDb2RlICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5DaXR5ICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5TdGF0ZSArIFwiIFwiICsgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeTtcbiAgICAgICAgY29uc29sZS5sb2coJ2dlb2NvZGluZyAnICsgYWRkcmVzcyk7XG5cbiAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7ICdhZGRyZXNzJzogYWRkcmVzcyB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGxldCBnZW9jb2RlID0ge2lzbzI6JycsIGxhdDonJywgbG5nOicnfTtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAnT0snKSB7XG4gICAgICAgICAgICAgICAgZ2VvY29kZSA9IHJlc3VsdHNbMF07XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZW9jb2RlIHdhcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246ICcgKyBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxhdGxuZyA9IGdlb2NvZGUuZ2VvbWV0cnkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGdlb2NvZGUuaXNvMiA9IG1lLmdldENvdW50cnlDb2RlRnJvbVJlc3VsdChnZW9jb2RlKTtcbiAgICAgICAgICAgIGdlb2NvZGUubGF0ID0gbGF0bG5nLmxhdCgpOyBcbiAgICAgICAgICAgIGdlb2NvZGUubG5nID0gbGF0bG5nLmxuZygpOyBcblxuICAgICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xlYXJNYXJrZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5tYXJrZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldE1hcChudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG1hcmtlciBpcyBjbGlja2VkIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50cztcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHBpY2t1cFBvaW50cy5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW3hdID0gdGhpcy5nZXRNYXJrZXIocGlja3VwUG9pbnRzW3hdKTtcbiAgICAgICAgICAgIC8vICAgIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZXMgZm9yIGxhdCxsbmcgd2UgaGF2ZSBhcmUgcm91bmRlZCwgc28gdGhleSB3aWxsIG5vdCBtYXRjaCB0aGUgb25lcyByZXR1cm5lZCBieSBnb29nbGVcbiAgICAgICAgICAgIHBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5hZGRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmKHR5cGVvZihjYWxsYmFjaykhPSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXRCb3VuZHMoKVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZXR1cm4gYSBtYXJrZXIgZm9yIHRoZSBnbWFwcyBcbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKHBpY2t1cFBvaW50LkxhdCwgcGlja3VwUG9pbnQuTG9uZyksXG4gICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxuICAgICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuY3VycmVudF9pY29uLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuIFxuXG4gICAgICAgIHJldHVybiBtYXJrZXI7XG4gICAgIH1cblxuICAgIGZpdEJvdW5kcygpIHtcbiAgICAgIHZhciBib3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKCk7XG4gICAgICBmb3IoIGxldCB4ID0gMDsgeDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKyt4ICl7XG4gICAgICAgIGJvdW5kcy5leHRlbmQodGhpcy5tYXJrZXJzW3hdLmdldFBvc2l0aW9uKCkpOyBcbiAgICAgIH0gXG4gICAgICB0aGlzLm1hcC5maXRCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkgeyBcbiAgICAgICAgbGV0IHNlbGVjdGVkID0ge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuaWNvbl9zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICBzY2FsZWRTaXplOiBuZXcgZ29vZ2xlLm1hcHMuU2l6ZSg1MCwgNTApLCAvLyBzY2FsZWQgc2l6ZVxuICAgICAgICAgICAgICAgIG9yaWdpbjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsMCksIC8vIG9yaWdpblxuICAgICAgICAgICAgICAgIGFuY2hvcjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsIDApIC8vIGFuY2hvclxuICAgICAgICB9O1xuICAgICAgICBsZXQgY3VyciA9IHtcbiAgICAgICAgICAgICAgICB1cmw6ICB0aGlzLmN1cnJlbnRfaWNvbixcbiAgICAgICAgICAgICAgICBzY2FsZWRTaXplOiBuZXcgZ29vZ2xlLm1hcHMuU2l6ZSg1MCwgNTApLCAvLyBzY2FsZWQgc2l6ZVxuICAgICAgICAgICAgICAgIG9yaWdpbjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsMCksIC8vIG9yaWdpblxuICAgICAgICAgICAgICAgIGFuY2hvcjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsIDApIC8vIGFuY2hvclxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbaV0uc2V0SWNvbihcbiAgICAgICAgICAgICAgaWR4ID09IGkgXG4gICAgICAgICAgICAgID8gXG4gICAgICAgICAgICAgIHNlbGVjdGVkXG4gICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgY3VyclxuICAgICAgICAgICAgKTsgIFxuICAgICAgICB9XG4gICAgfVxuXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeOpenMap = function () {\n    function ShiptimizeOpenMap() {\n        _classCallCheck(this, ShiptimizeOpenMap);\n\n        this.isScriptLoaded = false;\n        this.markers = [];\n        this.map = null;\n\n        /** \n         * the root url for the icons it's different for every platform  \n         * make sure to include a trailing / \n         */\n        this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n    }\n\n    /** \n     *\n     * @param string imageUrl - full url to the icon \n     * @return L.icon object \n     */\n\n\n    _createClass(ShiptimizeOpenMap, [{\n        key: 'createIcon',\n        value: function createIcon(imageUrl) {\n            return L.icon({\n                iconUrl: imageUrl,\n                iconSize: [50, 50], // size of the icon \n                iconAnchor: [25, 25], // point of the icon which will correspond to marker's location \n                popupAnchor: [-25, -50] // point from which the popup should open relative to the iconAnchor\n            });\n        }\n\n        /** \n         * @param decimal lat \n         * @param decimal lng \n         */\n\n    }, {\n        key: 'centerMap',\n        value: function centerMap(lat, lng) {\n            var latlng = L.latLng(lat, lng);\n        }\n\n        /** \n         * if the script has not been loaded , load it. \n         * We use this function because we only want to load the script when the user clicks the button \n         */\n\n    }, {\n        key: 'grantReady',\n        value: function grantReady() {\n            if (!this.isScriptLoaded) {\n                this.loadScript();\n            }\n        }\n\n        /** \n         * @param f_callback what function to call when the request resolves \n         * @param city - city name \n         * @param country - country in iso2 uppercase \n         * @param postalcode - the postal code \n         * @param streetname - the streetname \n         */\n\n    }, {\n        key: 'geocodeAddress',\n        value: function geocodeAddress(f_callback, city, country, postalcode, streetname) {\n            var queryString = \"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1\" + \"&city=\" + city + \"&country=\" + country;\n\n            if (typeof postalcode != 'undefined') {\n                if (country == 'PT' || country == 'Portugal') {\n                    postalcode = postalcode.substr(0, 4);\n                }\n                queryString += \"&postalcode=\" + postalcode;\n            }\n\n            if (typeof streetname != 'undefined') {\n                queryString += \"&street=\" + streetname;\n            }\n\n            jQuery.getJSON(queryString, {}, function (response) {\n                var geocode = {\n                    'iso2': '',\n                    'lat': '',\n                    'lng': ''\n                };\n\n                if (response.length > 0) {\n                    var location = response[0];\n\n                    geocode.iso2 = location.address.country_code;\n\n                    geocode.lat = location.lat;\n                    geocode.lng = location.lon;\n                }\n                f_callback(geocode);\n\n                console.log(response);\n            });\n        }\n    }, {\n        key: 'geocode',\n\n\n        /**\n         *  \n         * @param shippingData, the address parts       \n         * @param f_callback , the function to call when all mighty google returns a result \n         */\n        value: function geocode(shippingData, f_callback) {\n            var _this = this;\n\n            console.log(shippingData);\n            this.grantReady();\n\n            this.geocodeAddress(function (geocode) {\n                if (!geocode.lat) {\n                    return _this.geocodeAddress(function (geocode) {\n                        f_callback(geocode);\n                    }, shippingData.Address.City, shippingData.Address.Country);\n                }\n\n                f_callback(geocode);\n            }, shippingData.Address.City, shippingData.Address.Country, shippingData.Address.PostalCode, shippingData.Address.Streetname1);\n        }\n    }, {\n        key: 'loadScript',\n        value: function loadScript() {\n            _shiptimizeUtils2.default.injectExternalScript(SHIPTIMIZE_PLUGIN_URL + \"assets/js/leaflet-1.4.0.js\");\n            this.isScriptLoaded = true;\n            this.loadMap();\n            return;\n        }\n\n        /** \n         * Leaflet does not receive a callback so we wait here for the script to be loaded \n         */\n\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            var _this2 = this;\n\n            if (typeof L == 'undefined') {\n                setTimeout(function () {\n                    _this2.loadMap();\n                }, 200);\n                return;\n            }\n\n            this.icon_selected = this.createIcon(shiptimize_icon_folder + 'selected.png');\n            this.icon_default = this.createIcon(shiptimize_icon_folder + 'default.png');\n            this.current_icon = this.icon_default;\n\n            this.map = new L.map(jQuery(\".shiptimize-pickup__map\").get(0), {\n                \"zoom\": 16,\n                \"center\": [51.505, -0.09]\n            });\n\n            L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n                \"attribution\": '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n            }).addTo(this.map);\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            if (this.markers.length > 0) {\n                for (var i = 0; i < this.markers.length; ++i) {\n                    this.map.removeLayer(this.markers[i]);\n                }\n            }\n            this.markers = [];\n        }\n\n        /** \n         * Add the markers to map \n         * @param array pickupPoints - an array of pickupPoints\n         * @param function callback \n         */\n\n    }, {\n        key: 'addMarkers',\n        value: function addMarkers(pickupPoints, callback) {\n            var _this3 = this;\n\n            this.pickupPoints = pickupPoints;\n\n            var _loop = function _loop(x) {\n                _this3.markers[x] = _this3.getMarker(pickupPoints[x]);\n                //    we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n                _this3.pickupPoints[x].marker = _this3.markers[x];\n\n                _this3.markers[x].on('click', function () {\n                    if (typeof callback == 'function') {\n                        callback(x);\n                    }\n                });\n            };\n\n            for (var x = 0; x < pickupPoints.length; ++x) {\n                _loop(x);\n            }\n\n            this.fitBounds();\n        }\n    }, {\n        key: 'resetMarker',\n        value: function resetMarker(marker) {\n            marker.setIcon(this.icon_default);\n        }\n    }, {\n        key: 'selectMarker',\n        value: function selectMarker(marker) {\n            marker.setIcon(this.icon_selected);\n        }\n\n        /** \n         * Adjust the zoom in the map to display all the markers \n         * There's a fit bounds that receives 2 corners, but calculating them is up to us. \n         * corners: top left, bottom right     \n         * then we center the map at the center of the square  \n         */\n\n    }, {\n        key: 'fitBounds',\n        value: function fitBounds() {\n            var _this4 = this;\n\n            var bottomLeft = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n            var topRight = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n\n            for (var i = 0; i < this.pickupPoints.length; ++i) {\n                var lat = this.pickupPoints[i].Lat;\n                var lng = this.pickupPoints[i].Long;\n\n                if (lat < bottomLeft[0]) {\n                    bottomLeft[0] = lat;\n                }\n\n                if (lat > topRight[0]) {\n                    topRight[0] = lat;\n                }\n\n                if (lng > topRight[1]) {\n                    topRight[1] = lng;\n                }\n\n                if (lng < bottomLeft[1]) {\n                    bottomLeft[1] = lng;\n                }\n            }\n\n            var centerX = bottomLeft[0] + (topRight[0] - bottomLeft[0]) / 2;\n            var centerY = bottomLeft[1] + (topRight[1] - bottomLeft[1]) / 2;\n\n            this.map.panTo([centerX, centerY]);\n\n            this.map.fitBounds([bottomLeft, topRight]);\n\n            setTimeout(function () {\n                _this4.map.invalidateSize();\n            }, 200);\n        }\n\n        /** \n         * Return a marker for the openLayers \n         * IconAnchor: The coordinates of the \"tip\" of the icon (relative to its top left corner). \n         * The icon will be aligned so that this point is at the marker's geographical location. \n         * Centered by default if size is specified, also can be set in CSS with negative margins.\n         */\n\n    }, {\n        key: 'getMarker',\n        value: function getMarker(pickupPoint) {\n            var marker = L.marker([pickupPoint.Lat, pickupPoint.Long], {\n                \"icon\": this.current_icon,\n                \"title\": pickupPoint.Information.Name + \"\\n\" + pickupPoint.Information.Address\n            });\n            marker.addTo(this.map);\n            return marker;\n        }\n\n        /** \n         * Checks if we have an icon for this carrier.\n         * If yes then change the carrier icon\n         * If not then use the default icon\n         * \n         * @param int carrier_id - the carrier id \n         */\n\n    }, {\n        key: 'setCarrierIcon',\n        value: function setCarrierIcon(carrier_id) {\n            var _this5 = this;\n\n            if (typeof L == 'undefined') {\n                setTimeout(function () {\n                    _this5.setCarrierIcon(carrier_id);\n                }, 200);\n                return;\n            }\n            var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n            //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? this.createIcon(carrier_icon_url) : this.icon_default;\n            this.current_icon = this.createIcon(carrier_icon_url);\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         * @param int idx - the index to select \n         */\n\n    }, {\n        key: 'selectMarkerByIdx',\n        value: function selectMarkerByIdx(idx) {\n            for (var i = 0; i < this.markers.length; ++i) {\n                this.markers[i].setIcon(idx == i ? this.icon_selected : this.current_icon);\n            }\n        }\n    }]);\n\n    return ShiptimizeOpenMap;\n}();\n\nexports.default = ShiptimizeOpenMap;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJjZW50ZXJZIiwicGFuVG8iLCJpbnZhbGlkYXRlU2l6ZSIsInBpY2t1cFBvaW50IiwiSW5mb3JtYXRpb24iLCJOYW1lIiwiY2Fycmllcl9pZCIsInNldENhcnJpZXJJY29uIiwiY2Fycmllcl9pY29uX3VybCIsImlkeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLGlCO0FBRWpCLGlDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7O0FBRUE7Ozs7QUFJQSxhQUFLQyxXQUFMLEdBQW1CLE9BQU9DLHNCQUFQLElBQWtDLFdBQWxDLEdBQWdEQSxzQkFBaEQsR0FBeUUsRUFBNUY7QUFDSDs7QUFFRDs7Ozs7Ozs7O21DQUtXQyxRLEVBQVU7QUFDbEIsbUJBQU9DLEVBQUVDLElBQUYsQ0FBTztBQUNUQyx5QkFBU0gsUUFEQTtBQUVUSSwwQkFBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRkQsRUFFVztBQUNwQkMsNEJBQVksQ0FBQyxFQUFELEVBQUssRUFBTCxDQUhILEVBR2E7QUFDdEJDLDZCQUFhLENBQUMsQ0FBQyxFQUFGLEVBQU0sQ0FBQyxFQUFQLENBSkosQ0FJZTtBQUpmLGFBQVAsQ0FBUDtBQU1GOztBQUVEOzs7Ozs7O2tDQUlVQyxHLEVBQUtDLEcsRUFBSTtBQUNmLGdCQUFJQyxTQUFTUixFQUFFUyxNQUFGLENBQVNILEdBQVQsRUFBY0MsR0FBZCxDQUFiO0FBQ0g7O0FBRUQ7Ozs7Ozs7cUNBSWE7QUFDVCxnQkFBSSxDQUFDLEtBQUtiLGNBQVYsRUFBMEI7QUFDdEIscUJBQUtnQixVQUFMO0FBQ0g7QUFDSjs7QUFHSDs7Ozs7Ozs7Ozt1Q0FPZUMsVSxFQUFZQyxJLEVBQU1DLE8sRUFBU0MsVSxFQUFZQyxVLEVBQVk7QUFDaEUsZ0JBQUlDLGNBQWMsNEVBQ2hCLFFBRGdCLEdBQ0xKLElBREssR0FFaEIsV0FGZ0IsR0FFRkMsT0FGaEI7O0FBSUEsZ0JBQUksT0FBUUMsVUFBUixJQUF1QixX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QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0llLE9BQU94QixDQUFQLEdBQ0EsS0FBS1AsYUFETCxHQUVBLEtBQUtHLFlBSFQ7QUFLSDtBQUNKOzs7Ozs7a0JBL1FnQnJELGlCIiwiZmlsZSI6IjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi9zaGlwdGltaXplLXV0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZU9wZW5NYXAge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMubWFwID0gbnVsbDtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyBzaGlwdGltaXplX2ljb25fZm9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBpbWFnZVVybCAtIGZ1bGwgdXJsIHRvIHRoZSBpY29uIFxuICAgICAqIEByZXR1cm4gTC5pY29uIG9iamVjdCBcbiAgICAgKi9cbiAgICBjcmVhdGVJY29uKGltYWdlVXJsKSB7XG4gICAgICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICAgICAgICBpY29uVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgIGljb25TaXplOiBbNTAsIDUwXSwgLy8gc2l6ZSBvZiB0aGUgaWNvbiBcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsyNSwgMjVdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb24gXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWy0yNSwgLTUwXSAvLyBwb2ludCBmcm9tIHdoaWNoIHRoZSBwb3B1cCBzaG91bGQgb3BlbiByZWxhdGl2ZSB0byB0aGUgaWNvbkFuY2hvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIGRlY2ltYWwgbGF0IFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxuZyBcbiAgICAgKi8gXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKXtcbiAgICAgICAgbGV0IGxhdGxuZyA9IEwubGF0TG5nKGxhdCwgbG5nKTsgIFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0LiBcbiAgICAgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBsb2FkIHRoZSBzY3JpcHQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBncmFudFJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gZl9jYWxsYmFjayB3aGF0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCByZXNvbHZlcyBcbiAgICogQHBhcmFtIGNpdHkgLSBjaXR5IG5hbWUgXG4gICAqIEBwYXJhbSBjb3VudHJ5IC0gY291bnRyeSBpbiBpc28yIHVwcGVyY2FzZSBcbiAgICogQHBhcmFtIHBvc3RhbGNvZGUgLSB0aGUgcG9zdGFsIGNvZGUgXG4gICAqIEBwYXJhbSBzdHJlZXRuYW1lIC0gdGhlIHN0cmVldG5hbWUgXG4gICAqL1xuICBnZW9jb2RlQWRkcmVzcyhmX2NhbGxiYWNrLCBjaXR5LCBjb3VudHJ5LCBwb3N0YWxjb2RlLCBzdHJlZXRuYW1lKSB7XG4gICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/Zm9ybWF0PWpzb24mYWRkcmVzc2RldGFpbHM9MVwiICtcbiAgICAgIFwiJmNpdHk9XCIgKyBjaXR5ICtcbiAgICAgIFwiJmNvdW50cnk9XCIgKyBjb3VudHJ5O1xuXG4gICAgaWYgKHR5cGVvZiAocG9zdGFsY29kZSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChjb3VudHJ5ID09ICdQVCcgfHwgY291bnRyeSA9PSAnUG9ydHVnYWwnKSB7XG4gICAgICAgIHBvc3RhbGNvZGUgPSBwb3N0YWxjb2RlLnN1YnN0cigwLCA0KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5U3RyaW5nICs9IFwiJnBvc3RhbGNvZGU9XCIgKyBwb3N0YWxjb2RlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKHN0cmVldG5hbWUpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBxdWVyeVN0cmluZyArPSBcIiZzdHJlZXQ9XCIgKyBzdHJlZXRuYW1lO1xuICAgIH1cblxuICAgIGpRdWVyeS5nZXRKU09OKHF1ZXJ5U3RyaW5nLCB7fSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBsZXQgZ2VvY29kZSA9IHtcbiAgICAgICAgJ2lzbzInOiAnJyxcbiAgICAgICAgJ2xhdCc6ICcnLFxuICAgICAgICAnbG5nJzogJydcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlWzBdO1xuXG4gICAgICAgIGdlb2NvZGUuaXNvMiA9IGxvY2F0aW9uLmFkZHJlc3MuY291bnRyeV9jb2RlO1xuXG4gICAgICAgIGdlb2NvZGUubGF0ID0gbG9jYXRpb24ubGF0O1xuICAgICAgICBnZW9jb2RlLmxuZyA9IGxvY2F0aW9uLmxvbjtcbiAgICAgIH1cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogIFxuICAgKiBAcGFyYW0gc2hpcHBpbmdEYXRhLCB0aGUgYWRkcmVzcyBwYXJ0cyAgICAgICBcbiAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAqL1xuICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgZl9jYWxsYmFjaykge1xuICAgIGNvbnNvbGUubG9nKHNoaXBwaW5nRGF0YSk7XG4gICAgdGhpcy5ncmFudFJlYWR5KCk7XG5cbiAgICB0aGlzLmdlb2NvZGVBZGRyZXNzKChnZW9jb2RlKSA9PiB7XG4gICAgICBpZiAoIWdlb2NvZGUubGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2NvZGVBZGRyZXNzKGZ1bmN0aW9uIChnZW9jb2RlKSB7XG4gICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSk7XG4gICAgICB9XG5cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuUG9zdGFsQ29kZSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEpO1xuICB9XG4gICAgbG9hZFNjcmlwdCgpIHtcbiAgICAgICAgVXRpbHMuaW5qZWN0RXh0ZXJuYWxTY3JpcHQoU0hJUFRJTUlaRV9QTFVHSU5fVVJMICsgXCJhc3NldHMvanMvbGVhZmxldC0xLjQuMC5qc1wiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZE1hcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExlYWZsZXQgZG9lcyBub3QgcmVjZWl2ZSBhIGNhbGxiYWNrIHNvIHdlIHdhaXQgaGVyZSBmb3IgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZihMKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMubG9hZE1hcCgpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pY29uX3NlbGVjdGVkID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnc2VsZWN0ZWQucG5nJyk7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnZGVmYXVsdC5wbmcnKTtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDtcblxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBMLm1hcChqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCksIHtcbiAgICAgICAgICAgIFwiem9vbVwiOiAxNixcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IFs1MS41MDUsIC0wLjA5XVxuICAgICAgICB9KTtcblxuICAgICAgICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XG4gICAgICAgICAgICBcImF0dHJpYnV0aW9uXCI6ICcmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMubWFya2Vyc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50czsgXG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwaWNrdXBQb2ludHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XSA9IHRoaXMuZ2V0TWFya2VyKHBpY2t1cFBvaW50c1t4XSk7XG4gICAgICAgICAgICAvLyAgICB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciBsYXQsbG5nIHdlIGhhdmUgYXJlIHJvdW5kZWQsIHNvIHRoZXkgd2lsbCBub3QgbWF0Y2ggdGhlIG9uZXMgcmV0dXJuZWQgYnkgZ29vZ2xlXG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSA9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJlc2V0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgc2VsZWN0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGp1c3QgdGhlIHpvb20gaW4gdGhlIG1hcCB0byBkaXNwbGF5IGFsbCB0aGUgbWFya2VycyBcbiAgICAgKiBUaGVyZSdzIGEgZml0IGJvdW5kcyB0aGF0IHJlY2VpdmVzIDIgY29ybmVycywgYnV0IGNhbGN1bGF0aW5nIHRoZW0gaXMgdXAgdG8gdXMuIFxuICAgICAqIGNvcm5lcnM6IHRvcCBsZWZ0LCBib3R0b20gcmlnaHQgICAgIFxuICAgICAqIHRoZW4gd2UgY2VudGVyIHRoZSBtYXAgYXQgdGhlIGNlbnRlciBvZiB0aGUgc3F1YXJlICBcbiAgICAgKi9cbiAgICBmaXRCb3VuZHMoKSB7XG4gICAgICAgIGxldCBib3R0b21MZWZ0ID0gW3RoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMF0uTG9uZ107XG4gICAgICAgIGxldCB0b3BSaWdodCA9IFt0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzBdLkxvbmddO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waWNrdXBQb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBsYXQgPSB0aGlzLnBpY2t1cFBvaW50c1tpXS5MYXQ7XG4gICAgICAgICAgICBsZXQgbG5nID0gdGhpcy5waWNrdXBQb2ludHNbaV0uTG9uZztcblxuICAgICAgICAgICAgaWYgKGxhdCA8IGJvdHRvbUxlZnRbMF0pIHtcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0WzBdID0gbGF0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF0ID4gdG9wUmlnaHRbMF0pIHtcbiAgICAgICAgICAgICAgICB0b3BSaWdodFswXSA9IGxhdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxuZyA+IHRvcFJpZ2h0WzFdKSB7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHRbMV0gPSBsbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsbmcgPCBib3R0b21MZWZ0WzFdKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdFsxXSA9IGxuZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGNlbnRlclggPSBib3R0b21MZWZ0WzBdICsgKHRvcFJpZ2h0WzBdIC0gYm90dG9tTGVmdFswXSkgLyAyO1xuICAgICAgICBsZXQgY2VudGVyWSA9IGJvdHRvbUxlZnRbMV0gKyAodG9wUmlnaHRbMV0gLSBib3R0b21MZWZ0WzFdKSAvIDI7XG5cbiAgICAgICAgdGhpcy5tYXAucGFuVG8oW2NlbnRlclgsIGNlbnRlclldKTtcblxuICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoW1xuICAgICAgICAgICAgYm90dG9tTGVmdCxcbiAgICAgICAgICAgIHRvcFJpZ2h0XG4gICAgICAgIF0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKX0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIG9wZW5MYXllcnMgXG4gICAgICogSWNvbkFuY2hvcjogVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBcInRpcFwiIG9mIHRoZSBpY29uIChyZWxhdGl2ZSB0byBpdHMgdG9wIGxlZnQgY29ybmVyKS4gXG4gICAgICogVGhlIGljb24gd2lsbCBiZSBhbGlnbmVkIHNvIHRoYXQgdGhpcyBwb2ludCBpcyBhdCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLiBcbiAgICAgKiBDZW50ZXJlZCBieSBkZWZhdWx0IGlmIHNpemUgaXMgc3BlY2lmaWVkLCBhbHNvIGNhbiBiZSBzZXQgaW4gQ1NTIHdpdGggbmVnYXRpdmUgbWFyZ2lucy5cbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQpIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKFtwaWNrdXBQb2ludC5MYXQsIHBpY2t1cFBvaW50LkxvbmddLCB7XG4gICAgICAgICAgICBcImljb25cIjogdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICBcInRpdGxlXCI6IHBpY2t1cFBvaW50LkluZm9ybWF0aW9uLk5hbWUgKyBcIlxcblwiICsgcGlja3VwUG9pbnQuSW5mb3JtYXRpb24uQWRkcmVzc1xuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyLmFkZFRvKHRoaXMubWFwKTtcbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi9cbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKSB7XG4gICAgICAgIGlmICh0eXBlb2YoTCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNldENhcnJpZXJJY29uKGNhcnJpZXJfaWQpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlciArICcnICsgY2Fycmllcl9pZCArICcucG5nJztcbiAgICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCkgOiB0aGlzLmljb25fZGVmYXVsdDtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldEljb24oXG4gICAgICAgICAgICAgICAgaWR4ID09IGkgP1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2ljb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n")}]);
     1/******/ (function(modules) { // webpackBootstrap
     2/******/    // The module cache
     3/******/    var installedModules = {};
     4/******/
     5/******/    // The require function
     6/******/    function __webpack_require__(moduleId) {
     7/******/
     8/******/        // Check if module is in cache
     9/******/        if(installedModules[moduleId]) {
     10/******/            return installedModules[moduleId].exports;
     11/******/        }
     12/******/        // Create a new module (and put it into the cache)
     13/******/        var module = installedModules[moduleId] = {
     14/******/            i: moduleId,
     15/******/            l: false,
     16/******/            exports: {}
     17/******/        };
     18/******/
     19/******/        // Execute the module function
     20/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     21/******/
     22/******/        // Flag the module as loaded
     23/******/        module.l = true;
     24/******/
     25/******/        // Return the exports of the module
     26/******/        return module.exports;
     27/******/    }
     28/******/
     29/******/
     30/******/    // expose the modules object (__webpack_modules__)
     31/******/    __webpack_require__.m = modules;
     32/******/
     33/******/    // expose the module cache
     34/******/    __webpack_require__.c = installedModules;
     35/******/
     36/******/    // define getter function for harmony exports
     37/******/    __webpack_require__.d = function(exports, name, getter) {
     38/******/        if(!__webpack_require__.o(exports, name)) {
     39/******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
     40/******/        }
     41/******/    };
     42/******/
     43/******/    // define __esModule on exports
     44/******/    __webpack_require__.r = function(exports) {
     45/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
     46/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
     47/******/        }
     48/******/        Object.defineProperty(exports, '__esModule', { value: true });
     49/******/    };
     50/******/
     51/******/    // create a fake namespace object
     52/******/    // mode & 1: value is a module id, require it
     53/******/    // mode & 2: merge all properties of value into the ns
     54/******/    // mode & 4: return value when already ns object
     55/******/    // mode & 8|1: behave like require
     56/******/    __webpack_require__.t = function(value, mode) {
     57/******/        if(mode & 1) value = __webpack_require__(value);
     58/******/        if(mode & 8) return value;
     59/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
     60/******/        var ns = Object.create(null);
     61/******/        __webpack_require__.r(ns);
     62/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
     63/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
     64/******/        return ns;
     65/******/    };
     66/******/
     67/******/    // getDefaultExport function for compatibility with non-harmony modules
     68/******/    __webpack_require__.n = function(module) {
     69/******/        var getter = module && module.__esModule ?
     70/******/            function getDefault() { return module['default']; } :
     71/******/            function getModuleExports() { return module; };
     72/******/        __webpack_require__.d(getter, 'a', getter);
     73/******/        return getter;
     74/******/    };
     75/******/
     76/******/    // Object.prototype.hasOwnProperty.call
     77/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
     78/******/
     79/******/    // __webpack_public_path__
     80/******/    __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js";
     81/******/
     82/******/
     83/******/    // Load entry module and return exports
     84/******/    return __webpack_require__(__webpack_require__.s = "./shiptmize.js");
     85/******/ })
     86/************************************************************************/
     87/******/ ({
     88
     89/***/ "./css/leaflet.css":
     90/*!*************************!*\
     91  !*** ./css/leaflet.css ***!
     92  \*************************/
     93/*! no static exports found */
     94/***/ (function(module, exports, __webpack_require__) {
     95
     96eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvbGVhZmxldC5jc3M/OTU1NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiIuL2Nzcy9sZWFmbGV0LmNzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./css/leaflet.css\n");
     97
     98/***/ }),
     99
     100/***/ "./js/shiptimize-gmaps.js":
     101/*!********************************!*\
     102  !*** ./js/shiptimize-gmaps.js ***!
     103  \********************************/
     104/*! no static exports found */
     105/***/ (function(module, exports, __webpack_require__) {
     106
     107"use strict";
     108eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeGmaps = function () {\n    function ShiptimizeGmaps(key) {\n        _classCallCheck(this, ShiptimizeGmaps);\n\n        this.isScriptLoaded = false;\n        this.markers = [];\n        this.map = null;\n        this.pickupPoints = [];\n        this.key = key;\n\n        /** \n         * the root url for the icons it's different for every platform  \n         * make sure to include a trailing / \n         */\n        this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n        this.icon_selected = this.icon_folder + 'selected.png';\n        this.icon_default = this.icon_folder + 'default.png';\n        this.current_icon = this.icon_default;\n    }\n\n    /** \n     * Checks if we have an icon for this carrier.\n     * If yes then change the carrier icon\n     * If not then use the default icon\n     * \n     * @param int carrier_id - the carrier id \n     */\n\n\n    _createClass(ShiptimizeGmaps, [{\n        key: 'setCarrierIcon',\n        value: function setCarrierIcon(carrier_id) {\n            var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n            //this.current_icon = Utils.isUrlValid(carrier_icon_url) ?  carrier_icon_url : this.icon_default; \n            this.current_icon = carrier_icon_url;\n        }\n\n        /** \n         * if the script has not been loaded , load it \n         */\n\n    }, {\n        key: 'grantReady',\n        value: function grantReady() {\n            if (!this.isScriptLoaded) {\n                this.loadScript();\n            }\n        }\n    }, {\n        key: 'loadScript',\n        value: function loadScript() {\n            _shiptimizeUtils2.default.injectExternalScript(\"https://maps.googleapis.com/maps/api/js?key=\" + this.key + \"&callback=shiptimize.loadMap\");\n            this.isScriptLoaded = true;\n        }\n\n        /** \n         * Load the map into the element \n         * This function needs the script to be loaded \n         */\n\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            console.log(\"displaying map on container with \" + jQuery(\".shiptimize-pickup__map\").width() + \" \" + jQuery(\".shiptimize-pickup__map\").height(), jQuery(\".shiptimize-pickup__map\").get(0));\n            this.map = new google.maps.Map(jQuery(\".shiptimize-pickup__map\").get(0), {\n                center: { lat: -34.397, lng: 150.644 },\n                zoom: 16,\n                mapTypeControl: false\n            });\n        }\n\n        /** \n         * center the map \n         */\n\n    }, {\n        key: 'centerMap',\n        value: function centerMap(lat, lng) {\n            this.map.setCenter(new google.maps.LatLng(lat, lng));\n        }\n\n        /** \n         * Extract the country code from a geocode result\n         * @param geocode - a google.maps.Geocoder result \n         * @return string alpha-2 code for the country name \n         */\n\n    }, {\n        key: 'getCountryCodeFromResult',\n        value: function getCountryCodeFromResult(geocode) {\n            if (typeof geocode.address_components == \"undefined\") {\n                return \"\";\n            }\n\n            var components = geocode.address_components;\n            for (var i = 0; i < components.length; ++i) {\n                var types = components[i].types;\n\n                for (var j = 0; j < types.length; ++j) {\n                    if (types[j] == 'country') {\n                        return components[i].short_name;\n                    }\n                }\n            }\n        }\n\n        /**\n         *  \n         * @param shippingData, the address parts       \n         * @param f_callback , the function to call when all mighty google returns a result \n         */\n\n    }, {\n        key: 'geocode',\n        value: function geocode(shippingData, f_callback) {\n            var _this = this;\n\n            if (typeof google == 'undefined') {\n                //script not loaded yet\n                setTimeout(function () {\n                    _this.geocode(shippingData, f_callback);\n                }, 200);\n                return;\n            }\n\n            var geocoder = new google.maps.Geocoder();\n            var me = this;\n\n            var address = shippingData.Address.Streetname1 + \" \" + shippingData.Address.Streetname2 + \" \" + shippingData.Address.postalCode + \" \" + shippingData.Address.City + \" \" + shippingData.Address.State + \" \" + shippingData.Address.Country;\n            console.log('geocoding ' + address);\n\n            geocoder.geocode({ 'address': address }, function (results, status) {\n                var geocode = { iso2: '', lat: '', lng: '' };\n\n                if (status == 'OK') {\n                    geocode = results[0];\n                } else {\n                    console.log('Geocode was not successful for the following reason: ' + status);\n                    f_callback(geocode);\n                    return;\n                }\n\n                var latlng = geocode.geometry.location;\n\n                geocode.iso2 = me.getCountryCodeFromResult(geocode);\n                geocode.lat = latlng.lat();\n                geocode.lng = latlng.lng();\n\n                f_callback(geocode);\n            });\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            if (this.markers.length > 0) {\n                for (var i = 0; i < this.markers.length; ++i) {\n                    this.markers[i].setMap(null);\n                }\n\n                this.markers = [];\n            }\n        }\n\n        /** \n         * Add the markers to map \n         * @param array pickupPoints - an array of pickupPoints\n         * @param callback - a function to call when the marker is clicked \n         */\n\n    }, {\n        key: 'addMarkers',\n        value: function addMarkers(pickupPoints, callback) {\n            var _this2 = this;\n\n            this.pickupPoints = pickupPoints;\n\n            var _loop = function _loop(x) {\n                _this2.markers[x] = _this2.getMarker(pickupPoints[x]);\n                //    we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n                pickupPoints[x].marker = _this2.markers[x];\n\n                _this2.markers[x].addListener('click', function () {\n                    if (typeof callback != 'undefined') {\n                        callback(x);\n                    }\n                });\n            };\n\n            for (var x = 0; x < pickupPoints.length; ++x) {\n                _loop(x);\n            }\n\n            this.fitBounds();\n        }\n\n        /** \n         * Return a marker for the gmaps \n         */\n\n    }, {\n        key: 'getMarker',\n        value: function getMarker(pickupPoint, callback) {\n            var marker = new google.maps.Marker({\n                position: new google.maps.LatLng(pickupPoint.Lat, pickupPoint.Long),\n                map: this.map,\n                icon: {\n                    url: this.current_icon,\n                    scaledSize: new google.maps.Size(50, 50), // scaled size\n                    origin: new google.maps.Point(0, 0), // origin\n                    anchor: new google.maps.Point(0, 0) // anchor\n                }\n            });\n\n            return marker;\n        }\n    }, {\n        key: 'fitBounds',\n        value: function fitBounds() {\n            var bounds = new google.maps.LatLngBounds();\n            for (var x = 0; x < this.markers.length; ++x) {\n                bounds.extend(this.markers[x].getPosition());\n            }\n            this.map.fitBounds(bounds);\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         * @param int idx - the index to select \n         */\n\n    }, {\n        key: 'selectMarkerByIdx',\n        value: function selectMarkerByIdx(idx) {\n            var selected = {\n                url: this.icon_selected,\n                scaledSize: new google.maps.Size(50, 50), // scaled size\n                origin: new google.maps.Point(0, 0), // origin\n                anchor: new google.maps.Point(0, 0) // anchor\n            };\n            var curr = {\n                url: this.current_icon,\n                scaledSize: new google.maps.Size(50, 50), // scaled size\n                origin: new google.maps.Point(0, 0), // origin\n                anchor: new google.maps.Point(0, 0) // anchor\n            };\n\n            for (var i = 0; i < this.markers.length; ++i) {\n                this.markers[i].setIcon(idx == i ? selected : curr);\n            }\n        }\n    }]);\n\n    return ShiptimizeGmaps;\n}();\n\nexports.default = ShiptimizeGmaps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzPzBiZjEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZUdtYXBzIiwia2V5IiwiaXNTY3JpcHRMb2FkZWQiLCJtYXJrZXJzIiwibWFwIiwicGlja3VwUG9pbnRzIiwiaWNvbl9mb2xkZXIiLCJzaGlwdGltaXplX2ljb25fZm9sZGVyIiwiaWNvbl9zZWxlY3RlZCIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImNhcnJpZXJfaWQiLCJjYXJyaWVyX2ljb25fdXJsIiwibG9hZFNjcmlwdCIsIlV0aWxzIiwiaW5qZWN0RXh0ZXJuYWxTY3JpcHQiLCJjb25zb2xlIiwibG9nIiwialF1ZXJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXQiLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiY2VudGVyIiwibGF0IiwibG5nIiwiem9vbSIsIm1hcFR5cGVDb250cm9sIiwic2V0Q2VudGVyIiwiTGF0TG5nIiwiZ2VvY29kZSIsImFkZHJlc3NfY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJpIiwibGVuZ3RoIiwidHlwZXMiLCJqIiwic2hvcnRfbmFtZSIsInNoaXBwaW5nRGF0YSIsImZfY2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiZ2VvY29kZXIiLCJHZW9jb2RlciIsIm1lIiwiYWRkcmVzcyIsIkFkZHJlc3MiLCJTdHJlZXRuYW1lMSIsIlN0cmVldG5hbWUyIiwicG9zdGFsQ29kZSIsIkNpdHkiLCJTdGF0ZSIsIkNvdW50cnkiLCJyZXN1bHRzIiwic3RhdHVzIiwiaXNvMiIsImxhdGxuZyIsImdlb21ldHJ5IiwibG9jYXRpb24iLCJnZXRDb3VudHJ5Q29kZUZyb21SZXN1bHQiLCJzZXRNYXAiLCJjYWxsYmFjayIsIngiLCJnZXRNYXJrZXIiLCJtYXJrZXIiLCJhZGRMaXN0ZW5lciIsImZpdEJvdW5kcyIsInBpY2t1cFBvaW50IiwiTWFya2VyIiwicG9zaXRpb24iLCJMYXQiLCJMb25nIiwiaWNvbiIsInVybCIsInNjYWxlZFNpemUiLCJTaXplIiwib3JpZ2luIiwiUG9pbnQiLCJhbmNob3IiLCJib3VuZHMiLCJMYXRMbmdCb3VuZHMiLCJleHRlbmQiLCJnZXRQb3NpdGlvbiIsImlkeCIsInNlbGVjdGVkIiwiY3VyciIsInNldEljb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxlO0FBRWpCLDZCQUFZQyxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7QUFDQSxhQUFLQyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsYUFBS0osR0FBTCxHQUFXQSxHQUFYOztBQUVBOzs7O0FBSUEsYUFBS0ssV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFpREEsc0JBQWpELEdBQTBFLEVBQTdGO0FBQ0EsYUFBS0MsYUFBTCxHQUFxQixLQUFLRixXQUFMLEdBQWlCLGNBQXRDO0FBQ0EsYUFBS0csWUFBTCxHQUFvQixLQUFLSCxXQUFMLEdBQWlCLGFBQXJDO0FBQ0EsYUFBS0ksWUFBTCxHQUFvQixLQUFLRCxZQUF6QjtBQUNIOztBQUdEOzs7Ozs7Ozs7Ozt1Q0FPZUUsVSxFQUFXO0FBQ3hCLGdCQUFJQyxtQkFBbUIsS0FBS04sV0FBTCxHQUFpQixFQUFqQixHQUFvQkssVUFBcEIsR0FBK0IsTUFBdEQ7QUFDQTtBQUNBLGlCQUFLRCxZQUFMLEdBQW9CRSxnQkFBcEI7QUFDRDs7QUFHRDs7Ozs7O3FDQUdhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLVixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLVyxVQUFMO0FBQ0g7QUFDSjs7O3FDQUVZO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQixpREFBaUQsS0FBS2QsR0FBdEQsR0FBNEQsOEJBQXZGO0FBQ0EsaUJBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7QUFFRDs7Ozs7OztrQ0FJVTtBQUNOYyxvQkFBUUMsR0FBUixDQUFZLHND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QUFJQyxXQUFXO0FBQ1BYLHFCQUFNLEtBQUtsRSxhQURKO0FBRVBtRSw0QkFBWSxJQUFJckQsT0FBT0MsSUFBUCxDQUFZcUQsSUFBaEIsQ0FBcUIsRUFBckIsRUFBeUIsRUFBekIsQ0FGTCxFQUVtQztBQUMxQ0Msd0JBQVEsSUFBSXZELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXdCLENBQXhCLENBSEQsRUFHNkI7QUFDcENDLHdCQUFRLElBQUl6RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF5QixDQUF6QixDQUpELENBSTZCO0FBSjdCLGFBQWY7QUFNQSxnQkFBSVEsT0FBTztBQUNIWixxQkFBTSxLQUFLaEUsWUFEUjtBQUVIaUUsNEJBQVksSUFBSXJELE9BQU9DLElBQVAsQ0FBWXFELElBQWhCLENBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLENBRlQsRUFFdUM7QUFDMUNDLHdCQUFRLElBQUl2RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF3QixDQUF4QixDQUhMLEVBR2lDO0FBQ3BDQyx3QkFBUSxJQUFJekQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FKTCxDQUlpQztBQUpqQyxhQUFYOztBQU9BLGlCQUFLLElBQUkzQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS2hDLE9BQUwsQ0FBYWlDLE1BQWpDLEVBQXlDLEVBQUVELENBQTNDLEVBQThDO0FBQzFDLHFCQUFLaEMsT0FBTCxDQUFhZ0MsQ0FBYixFQUFnQm9ELE9BQWhCLENBQ0VILE9BQU9qRCxDQUFQLEdBRUFrRCxRQUZBLEdBSUFDLElBTEY7QUFPSDtBQUNKOzs7Ozs7a0JBMU5nQnRGLGUiLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7ICBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZUdtYXBzIHtcblxuICAgIGNvbnN0cnVjdG9yKGtleSkge1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgICAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gW107XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogdGhlIHJvb3QgdXJsIGZvciB0aGUgaWNvbnMgaXQncyBkaWZmZXJlbnQgZm9yIGV2ZXJ5IHBsYXRmb3JtICBcbiAgICAgICAgICogbWFrZSBzdXJlIHRvIGluY2x1ZGUgYSB0cmFpbGluZyAvIFxuICAgICAgICAgKi8gXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyAgc2hpcHRpbWl6ZV9pY29uX2ZvbGRlciA6ICcnOyAgXG4gICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA9IHRoaXMuaWNvbl9mb2xkZXIrJ3NlbGVjdGVkLnBuZyc7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5pY29uX2ZvbGRlcisnZGVmYXVsdC5wbmcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRfaWNvbiA9IHRoaXMuaWNvbl9kZWZhdWx0OyBcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBDaGVja3MgaWYgd2UgaGF2ZSBhbiBpY29uIGZvciB0aGlzIGNhcnJpZXIuXG4gICAgICogSWYgeWVzIHRoZW4gY2hhbmdlIHRoZSBjYXJyaWVyIGljb25cbiAgICAgKiBJZiBub3QgdGhlbiB1c2UgdGhlIGRlZmF1bHQgaWNvblxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpbnQgY2Fycmllcl9pZCAtIHRoZSBjYXJyaWVyIGlkIFxuICAgICAqLyBcbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKXtcbiAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlcisnJytjYXJyaWVyX2lkKycucG5nJzsgXG4gICAgICAvL3RoaXMuY3VycmVudF9pY29uID0gVXRpbHMuaXNVcmxWYWxpZChjYXJyaWVyX2ljb25fdXJsKSA/ICBjYXJyaWVyX2ljb25fdXJsIDogdGhpcy5pY29uX2RlZmF1bHQ7IFxuICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSBjYXJyaWVyX2ljb25fdXJsO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIGlmIHRoZSBzY3JpcHQgaGFzIG5vdCBiZWVuIGxvYWRlZCAsIGxvYWQgaXQgXG4gICAgICovXG4gICAgZ3JhbnRSZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2NyaXB0TG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRTY3JpcHQoKSB7XG4gICAgICAgIFV0aWxzLmluamVjdEV4dGVybmFsU2NyaXB0KFwiaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT1cIiArIHRoaXMua2V5ICsgXCImY2FsbGJhY2s9c2hpcHRpbWl6ZS5sb2FkTWFwXCIpO1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogTG9hZCB0aGUgbWFwIGludG8gdGhlIGVsZW1lbnQgXG4gICAgICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0aGUgc2NyaXB0IHRvIGJlIGxvYWRlZCBcbiAgICAgKi9cbiAgICBsb2FkTWFwKCkgeyAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGlzcGxheWluZyBtYXAgb24gY29udGFpbmVyIHdpdGggXCIgKyBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS53aWR0aCgpICsgXCIgXCIralF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuaGVpZ2h0KCkgLGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmdldCgwKSk7IFxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuZ2V0KDApLCB7XG4gICAgICAgICAgICBjZW50ZXI6IHsgbGF0OiAtMzQuMzk3LCBsbmc6IDE1MC42NDQgfSxcbiAgICAgICAgICAgIHpvb206IDE2LFxuICAgICAgICAgICAgbWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogY2VudGVyIHRoZSBtYXAgXG4gICAgICovXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKSB7XG4gICAgICAgIHRoaXMubWFwLnNldENlbnRlcihuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdCwgbG5nKSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEV4dHJhY3QgdGhlIGNvdW50cnkgY29kZSBmcm9tIGEgZ2VvY29kZSByZXN1bHRcbiAgICAgKiBAcGFyYW0gZ2VvY29kZSAtIGEgZ29vZ2xlLm1hcHMuR2VvY29kZXIgcmVzdWx0IFxuICAgICAqIEByZXR1cm4gc3RyaW5nIGFscGhhLTIgY29kZSBmb3IgdGhlIGNvdW50cnkgbmFtZSBcbiAgICAgKi8gXG4gICAgZ2V0Q291bnRyeUNvZGVGcm9tUmVzdWx0KGdlb2NvZGUpe1xuICAgICAgaWYodHlwZW9mKGdlb2NvZGUuYWRkcmVzc19jb21wb25lbnRzKSA9PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgICAgcmV0dXJuIFwiXCI7IFxuICAgICAgfVxuXG4gICAgICBsZXQgY29tcG9uZW50cyA9IGdlb2NvZGUuYWRkcmVzc19jb21wb25lbnRzO1xuICAgICAgZm9yKCBsZXQgaT0wOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7ICsraSApe1xuICAgICAgICBsZXQgdHlwZXMgPSBjb21wb25lbnRzW2ldLnR5cGVzOyBcblxuICAgICAgICBmb3IobGV0IGo9MDsgaiA8IHR5cGVzLmxlbmd0aDsgKytqICl7XG4gICAgICAgICAgaWYoIHR5cGVzW2pdID09ICdjb3VudHJ5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbaV0uc2hvcnRfbmFtZTsgXG4gICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgXG4gICAgICogQHBhcmFtIHNoaXBwaW5nRGF0YSwgdGhlIGFkZHJlc3MgcGFydHMgICAgICAgXG4gICAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAgICovIFxuICAgIGdlb2NvZGUoc2hpcHBpbmdEYXRhLCAgZl9jYWxsYmFjaykgeyBcbiAgICAgIGlmKHR5cGVvZihnb29nbGUpID09ICd1bmRlZmluZWQnKXsgLy9zY3JpcHQgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e3RoaXMuZ2VvY29kZShzaGlwcGluZ0RhdGEsIGZfY2FsbGJhY2spOyB9LCAyMDApOyBcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAgIGxldCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgICBsZXQgbWUgID0gdGhpczsgXG5cbiAgICAgICAgdmFyIGFkZHJlc3MgPSBzaGlwcGluZ0RhdGEuQWRkcmVzcy5TdHJlZXRuYW1lMSArIFwiIFwiICsgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTIgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLnBvc3RhbENvZGUgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNpdHkgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlN0YXRlICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5Db3VudHJ5O1xuICAgICAgICBjb25zb2xlLmxvZygnZ2VvY29kaW5nICcgKyBhZGRyZXNzKTtcblxuICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKHsgJ2FkZHJlc3MnOiBhZGRyZXNzIH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykge1xuICAgICAgICAgICAgbGV0IGdlb2NvZGUgPSB7aXNvMjonJywgbGF0OicnLCBsbmc6Jyd9O1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09ICdPSycpIHtcbiAgICAgICAgICAgICAgICBnZW9jb2RlID0gcmVzdWx0c1swXTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dlb2NvZGUgd2FzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbjogJyArIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGF0bG5nID0gZ2VvY29kZS5nZW9tZXRyeS5sb2NhdGlvbjtcblxuICAgICAgICAgICAgZ2VvY29kZS5pc28yID0gbWUuZ2V0Q291bnRyeUNvZGVGcm9tUmVzdWx0KGdlb2NvZGUpO1xuICAgICAgICAgICAgZ2VvY29kZS5sYXQgPSBsYXRsbmcubGF0KCk7IFxuICAgICAgICAgICAgZ2VvY29kZS5sbmcgPSBsYXRsbmcubG5nKCk7IFxuXG4gICAgICAgICAgICBmX2NhbGxiYWNrKGdlb2NvZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhck1hcmtlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnNbaV0uc2V0TWFwKG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGQgdGhlIG1hcmtlcnMgdG8gbWFwIFxuICAgICAqIEBwYXJhbSBhcnJheSBwaWNrdXBQb2ludHMgLSBhbiBhcnJheSBvZiBwaWNrdXBQb2ludHNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbWFya2VyIGlzIGNsaWNrZWQgXG4gICAgICovXG4gICAgYWRkTWFya2VycyhwaWNrdXBQb2ludHMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gcGlja3VwUG9pbnRzO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGlja3VwUG9pbnRzLmxlbmd0aDsgKyt4KSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbeF0gPSB0aGlzLmdldE1hcmtlcihwaWNrdXBQb2ludHNbeF0pO1xuICAgICAgICAgICAgLy8gICAgd2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlcyBmb3IgbGF0LGxuZyB3ZSBoYXZlIGFyZSByb3VuZGVkLCBzbyB0aGV5IHdpbGwgbm90IG1hdGNoIHRoZSBvbmVzIHJldHVybmVkIGJ5IGdvb2dsZVxuICAgICAgICAgICAgcGlja3VwUG9pbnRzW3hdLm1hcmtlciA9IHRoaXMubWFya2Vyc1t4XTtcblxuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW3hdLmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSE9ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIGdtYXBzIFxuICAgICAqL1xuICAgIGdldE1hcmtlcihwaWNrdXBQb2ludCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcocGlja3VwUG9pbnQuTGF0LCBwaWNrdXBQb2ludC5Mb25nKSxcbiAgICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgICBpY29uOiB7XG4gICAgICAgICAgICAgICAgdXJsOiAgdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICAgICAgc2NhbGVkU2l6ZTogbmV3IGdvb2dsZS5tYXBzLlNpemUoNTAsIDUwKSwgLy8gc2NhbGVkIHNpemVcbiAgICAgICAgICAgICAgICBvcmlnaW46IG5ldyBnb29nbGUubWFwcy5Qb2ludCgwLDApLCAvLyBvcmlnaW5cbiAgICAgICAgICAgICAgICBhbmNob3I6IG5ldyBnb29nbGUubWFwcy5Qb2ludCgwLCAwKSAvLyBhbmNob3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gXG5cbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICAgfVxuXG4gICAgZml0Qm91bmRzKCkge1xuICAgICAgdmFyIGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTtcbiAgICAgIGZvciggbGV0IHggPSAwOyB4PCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK3ggKXtcbiAgICAgICAgYm91bmRzLmV4dGVuZCh0aGlzLm1hcmtlcnNbeF0uZ2V0UG9zaXRpb24oKSk7IFxuICAgICAgfSBcbiAgICAgIHRoaXMubWFwLmZpdEJvdW5kcyhib3VuZHMpO1xuICAgIH1cbiBcbiAgICAvKipcbiAgICAgKiBSZXNldCBhbGwgbWFya2VycyAgXG4gICAgICogU2VsZWN0IHRoZSBtYXJrZXIgb2YgaW5kZXggaWR4IGluIG1hcCBcbiAgICAgKiBAcGFyYW0gaW50IGlkeCAtIHRoZSBpbmRleCB0byBzZWxlY3QgXG4gICAgICovXG4gICAgc2VsZWN0TWFya2VyQnlJZHgoaWR4KSB7IFxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiAgdGhpcy5pY29uX3NlbGVjdGVkLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgIH07XG4gICAgICAgIGxldCBjdXJyID0ge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuY3VycmVudF9pY29uLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1tpXS5zZXRJY29uKFxuICAgICAgICAgICAgICBpZHggPT0gaSBcbiAgICAgICAgICAgICAgPyBcbiAgICAgICAgICAgICAgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICBjdXJyXG4gICAgICAgICAgICApOyAgXG4gICAgICAgIH1cbiAgICB9XG5cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-gmaps.js\n");
     109
     110/***/ }),
     111
     112/***/ "./js/shiptimize-open-map.js":
     113/*!***********************************!*\
     114  !*** ./js/shiptimize-open-map.js ***!
     115  \***********************************/
     116/*! no static exports found */
     117/***/ (function(module, exports, __webpack_require__) {
     118
     119"use strict";
     120eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeOpenMap = function () {\n    function ShiptimizeOpenMap() {\n        _classCallCheck(this, ShiptimizeOpenMap);\n\n        this.isScriptLoaded = false;\n        this.markers = [];\n        this.map = null;\n\n        /** \n         * the root url for the icons it's different for every platform  \n         * make sure to include a trailing / \n         */\n        this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n    }\n\n    /** \n     *\n     * @param string imageUrl - full url to the icon \n     * @return L.icon object \n     */\n\n\n    _createClass(ShiptimizeOpenMap, [{\n        key: 'createIcon',\n        value: function createIcon(imageUrl) {\n            return L.icon({\n                iconUrl: imageUrl,\n                iconSize: [50, 50], // size of the icon \n                iconAnchor: [25, 25], // point of the icon which will correspond to marker's location \n                popupAnchor: [-25, -50] // point from which the popup should open relative to the iconAnchor\n            });\n        }\n\n        /** \n         * @param decimal lat \n         * @param decimal lng \n         */\n\n    }, {\n        key: 'centerMap',\n        value: function centerMap(lat, lng) {\n            var latlng = L.latLng(lat, lng);\n        }\n\n        /** \n         * if the script has not been loaded , load it. \n         * We use this function because we only want to load the script when the user clicks the button \n         */\n\n    }, {\n        key: 'grantReady',\n        value: function grantReady() {\n            if (!this.isScriptLoaded) {\n                this.loadScript();\n            }\n        }\n\n        /** \n         * @param f_callback what function to call when the request resolves \n         * @param city - city name \n         * @param country - country in iso2 uppercase \n         * @param postalcode - the postal code \n         * @param streetname - the streetname \n         */\n\n    }, {\n        key: 'geocodeAddress',\n        value: function geocodeAddress(f_callback, city, country, postalcode, streetname) {\n            var queryString = \"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1\" + \"&city=\" + city + \"&country=\" + country;\n\n            if (typeof postalcode != 'undefined') {\n                if (country == 'PT' || country == 'Portugal') {\n                    postalcode = postalcode.substr(0, 4);\n                }\n                queryString += \"&postalcode=\" + postalcode;\n            }\n\n            if (typeof streetname != 'undefined') {\n                queryString += \"&street=\" + streetname;\n            }\n\n            jQuery.getJSON(queryString, {}, function (response) {\n                var geocode = {\n                    'iso2': '',\n                    'lat': '',\n                    'lng': ''\n                };\n\n                if (response.length > 0) {\n                    var location = response[0];\n\n                    geocode.iso2 = location.address.country_code;\n\n                    geocode.lat = location.lat;\n                    geocode.lng = location.lon;\n                }\n                f_callback(geocode);\n\n                console.log(response);\n            });\n        }\n    }, {\n        key: 'geocode',\n\n\n        /**\n         *  \n         * @param shippingData, the address parts       \n         * @param f_callback , the function to call when all mighty google returns a result \n         */\n        value: function geocode(shippingData, f_callback) {\n            var _this = this;\n\n            console.log(shippingData);\n            this.grantReady();\n\n            this.geocodeAddress(function (geocode) {\n                if (!geocode.lat) {\n                    return _this.geocodeAddress(function (geocode) {\n                        f_callback(geocode);\n                    }, shippingData.Address.City, shippingData.Address.Country);\n                }\n\n                f_callback(geocode);\n            }, shippingData.Address.City, shippingData.Address.Country, shippingData.Address.PostalCode, shippingData.Address.Streetname1);\n        }\n    }, {\n        key: 'loadScript',\n        value: function loadScript() {\n            _shiptimizeUtils2.default.injectExternalScript(SHIPTIMIZE_PLUGIN_URL + \"assets/js/leaflet-1.4.0.js\");\n            this.isScriptLoaded = true;\n            this.loadMap();\n            return;\n        }\n\n        /** \n         * Leaflet does not receive a callback so we wait here for the script to be loaded \n         */\n\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            var _this2 = this;\n\n            if (typeof L == 'undefined') {\n                setTimeout(function () {\n                    _this2.loadMap();\n                }, 200);\n                return;\n            }\n\n            this.icon_selected = this.createIcon(shiptimize_icon_folder + 'selected.png');\n            this.icon_default = this.createIcon(shiptimize_icon_folder + 'default.png');\n            this.current_icon = this.icon_default;\n\n            this.map = new L.map(jQuery(\".shiptimize-pickup__map\").get(0), {\n                \"zoom\": 16,\n                \"center\": [51.505, -0.09]\n            });\n\n            L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n                \"attribution\": '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n            }).addTo(this.map);\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            if (this.markers.length > 0) {\n                for (var i = 0; i < this.markers.length; ++i) {\n                    this.map.removeLayer(this.markers[i]);\n                }\n            }\n            this.markers = [];\n        }\n\n        /** \n         * Add the markers to map \n         * @param array pickupPoints - an array of pickupPoints\n         * @param function callback \n         */\n\n    }, {\n        key: 'addMarkers',\n        value: function addMarkers(pickupPoints, callback) {\n            var _this3 = this;\n\n            this.pickupPoints = pickupPoints;\n\n            var _loop = function _loop(x) {\n                _this3.markers[x] = _this3.getMarker(pickupPoints[x]);\n                //    we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n                _this3.pickupPoints[x].marker = _this3.markers[x];\n\n                _this3.markers[x].on('click', function () {\n                    if (typeof callback == 'function') {\n                        callback(x);\n                    }\n                });\n            };\n\n            for (var x = 0; x < pickupPoints.length; ++x) {\n                _loop(x);\n            }\n\n            this.fitBounds();\n        }\n    }, {\n        key: 'resetMarker',\n        value: function resetMarker(marker) {\n            marker.setIcon(this.icon_default);\n        }\n    }, {\n        key: 'selectMarker',\n        value: function selectMarker(marker) {\n            marker.setIcon(this.icon_selected);\n        }\n\n        /** \n         * Adjust the zoom in the map to display all the markers \n         * There's a fit bounds that receives 2 corners, but calculating them is up to us. \n         * corners: top left, bottom right     \n         * then we center the map at the center of the square  \n         */\n\n    }, {\n        key: 'fitBounds',\n        value: function fitBounds() {\n            var _this4 = this;\n\n            var bottomLeft = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n            var topRight = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n\n            for (var i = 0; i < this.pickupPoints.length; ++i) {\n                var lat = this.pickupPoints[i].Lat;\n                var lng = this.pickupPoints[i].Long;\n\n                if (lat < bottomLeft[0]) {\n                    bottomLeft[0] = lat;\n                }\n\n                if (lat > topRight[0]) {\n                    topRight[0] = lat;\n                }\n\n                if (lng > topRight[1]) {\n                    topRight[1] = lng;\n                }\n\n                if (lng < bottomLeft[1]) {\n                    bottomLeft[1] = lng;\n                }\n            }\n\n            var centerX = parseFloat(bottomLeft[0]) + (parseFloat(topRight[0]) - parseFloat(bottomLeft[0])) / 2;\n            var centerY = parseFloat(bottomLeft[1]) + (parseFloat(topRight[1]) - parseFloat(bottomLeft[1])) / 2;\n\n            this.map.panTo([centerX, centerY]);\n\n            this.map.fitBounds([bottomLeft, topRight]);\n\n            setTimeout(function () {\n                _this4.map.invalidateSize();\n            }, 200);\n        }\n\n        /** \n         * Return a marker for the openLayers \n         * IconAnchor: The coordinates of the \"tip\" of the icon (relative to its top left corner). \n         * The icon will be aligned so that this point is at the marker's geographical location. \n         * Centered by default if size is specified, also can be set in CSS with negative margins.\n         */\n\n    }, {\n        key: 'getMarker',\n        value: function getMarker(pickupPoint) {\n            var marker = L.marker([pickupPoint.Lat, pickupPoint.Long], {\n                \"icon\": this.current_icon,\n                \"title\": pickupPoint.Information.Name + \"\\n\" + pickupPoint.Information.Address\n            });\n            marker.addTo(this.map);\n            return marker;\n        }\n\n        /** \n         * Checks if we have an icon for this carrier.\n         * If yes then change the carrier icon\n         * If not then use the default icon\n         * \n         * @param int carrier_id - the carrier id \n         */\n\n    }, {\n        key: 'setCarrierIcon',\n        value: function setCarrierIcon(carrier_id) {\n            var _this5 = this;\n\n            if (typeof L == 'undefined') {\n                setTimeout(function () {\n                    _this5.setCarrierIcon(carrier_id);\n                }, 200);\n                return;\n            }\n            var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n            //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? this.createIcon(carrier_icon_url) : this.icon_default;\n            this.current_icon = this.createIcon(carrier_icon_url);\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         * @param int idx - the index to select \n         */\n\n    }, {\n        key: 'selectMarkerByIdx',\n        value: function selectMarkerByIdx(idx) {\n            for (var i = 0; i < this.markers.length; ++i) {\n                this.markers[i].setIcon(idx == i ? this.icon_selected : this.current_icon);\n            }\n        }\n    }]);\n\n    return ShiptimizeOpenMap;\n}();\n\nexports.default = ShiptimizeOpenMap;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJwYXJzZUZsb2F0IiwiY2VudGVyWSIsInBhblRvIiwiaW52YWxpZGF0ZVNpemUiLCJwaWNrdXBQb2ludCIsIkluZm9ybWF0aW9uIiwiTmFtZSIsImNhcnJpZXJfaWQiLCJzZXRDYXJyaWVySWNvbiIsImNhcnJpZXJfaWNvbl91cmwiLCJpZHgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxpQjtBQUVqQixpQ0FBYztBQUFBOztBQUNWLGFBQUtDLGNBQUwsR0FBc0IsS0FBdEI7QUFDQSxhQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLGFBQUtDLEdBQUwsR0FBVyxJQUFYOztBQUVBOzs7O0FBSUEsYUFBS0MsV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFnREEsc0JBQWhELEdBQXlFLEVBQTVGO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzttQ0FLV0MsUSxFQUFVO0FBQ2xCLG1CQUFPQyxFQUFFQyxJQUFGLENBQU87QUFDVEMseUJBQVNILFFBREE7QUFFVEksMEJBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZELEVBRVc7QUFDcEJDLDRCQUFZLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FISCxFQUdhO0FBQ3RCQyw2QkFBYSxDQUFDLENBQUMsRUFBRixFQUFNLENBQUMsRUFBUCxDQUpKLENBSWU7QUFKZixhQUFQLENBQVA7QUFNRjs7QUFFRDs7Ozs7OztrQ0FJVUMsRyxFQUFLQyxHLEVBQUk7QUFDZixnQkFBSUMsU0FBU1IsRUFBRVMsTUFBRixDQUFTSCxHQUFULEVBQWNDLEdBQWQsQ0FBYjtBQUNIOztBQUVEOzs7Ozs7O3FDQUlhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLYixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLZ0IsVUFBTDtBQUNIO0FBQ0o7O0FBR0g7Ozs7Ozs7Ozs7dUNBT2VDLFUsRUFBWUMsSSxFQUFNQyxPLEVBQVNDLFUsRUFBWUMsVSxFQUFZO0FBQ2hFLGdCQUFJQyxjQUFjLDRFQUNoQixRQURnQixHQUNMSixJQURLLEdBRWhCLFdBRmdCLEdBRUZDLE9BRmhCOztBQUlBLGdCQUFJLE9BQVFDLFVBQVIsSUFBdUIsV0FBM0IsRUFBd0M7QUFDdEMsb0JBQUlELFdBQVcsSUFBWCxJQUFtQkEsV0FBVyxVQUFsQyxFQUE4QztBQUM1Q0MsaUNBQWFBLFdBQVdHLE1BQVgsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsQ0FBYjtBQUNEO0FBQ0RELCtCQUFlLGlCQUFpQkYsVUFBaEM7QUFDRDs7QUFFRCxnQkFBSSxPQUFRQyxVQUFSLElBQXVCLFdBQTNCLEVBQXdDO0FBQ3RDQywrQkFBZSxhQUFhRCxVQUE1QjtBQUNEOztBQUVERyxtQkFBT0MsT0FBUCxDQUFlSCxXQUFmLEVBQTRCLEVBQTVCLEVBQWdDLFVBQVVJLFFBQVYsRUFBb0I7QUFDbEQsb0JBQUlDLFVBQVU7QUFDWiw0QkFBUSxFQURJO0FBRVosMkJBQU8sRUFGSztBQUdaLDJCQUFPO0FBSEssaUJBQWQ7O0FBTUEsb0JBQUlELFNBQVNFLE1BQVQsR0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsd0JBQUlDLFdBQVdILFNBQVMsQ0FBVCxDQUFmOztBQUVBQyw0QkFBUUcsSUFBUixHQUFlRCxTQUFTRSxPQUFULENBQWlCQyxZQUFoQzs7QUFFQUwsNEJBQVFmLEdBQVIsR0FBY2lCLFNBQVNqQixHQUF2QjtBQUNBZSw0QkFBUWQsR0FBUixHQUFjZ0IsU0FBU0ksR0FBdkI7QUFDRDtBQUNEaEIsMkJBQVdVLE9BQVg7O0FBRUFPLHdCQUFRQyxHQUFSLENBQVlULFFBQVo7QUFDRCxhQWxCRDtBQW1CRDs7Ozs7QUFFRDs7Ozs7Z0NBS1FVLFksRUFBY25CLFUsRUFBWTtBQUFBOztBQUNoQ2lCLG9CQUFRQyxHQUFSLENBQVlDLFlBQVo7QUFDQSxpQkFBS0MsVUFBTDs7QUFFQSxpQkFBS0MsY0FBTCxDQUFvQixVQUFDWCxPQUFELEVBQWE7QUFDL0Isb0JBQUksQ0FBQ0EsUUFBUWYsR0FBYixFQUFrQjtBQUNoQiwyQkFBTyxNQUFLMEIsY0FBTCxDQUFvQixVQUFVWCxPQUFWLEVBQW1CO0FBQzVDVixtQ0FBV1UsT0FBWDtBQUNELHFCQUZNLEVBRUpTLGFBQWFHLE9BQWIsQ0FBcUJDLElBRmpCLEVBRXVCSixhQUFhRyxPQUFiLENBQXFCRSxPQUY1QyxDQUFQO0FBR0Q7O0FBRUR4QiwyQkFBV1UsT0FBWDtBQUNELGFBUkQsRUFRR1MsYUFBYUcsT0FBYixDQUFxQkMsSUFSeEIsRUFROEJKLGFBQWFHLE9BQWIsQ0FBcUJFLE9BUm5ELEVBUTRETCxhQUFhRyxPQUFiLENBQXFCRyxVQVJqRixFQVE2Rk4sYUFBYUcsT0FBYixDQUFxQkksV0FSbEg7QUFTRDs7O3FDQUNjO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQkMsd0JBQXdCLDRCQUFuRDtBQUNBLGlCQUFLOUMsY0FBTCxHQUFzQixJQUF0QjtBQUNBLGlCQUFLK0MsT0FBTDtBQUNBO0FBQ0g7O0FBRUQ7Ozs7OztrQ0FHVTtBQUFBOztBQUNOLGdCQUFJLE9BQU96QyxDQUFQLElBQWEsV0FBakIsRUFBOEI7QUFDMUIwQywyQkFBVyxZQUFNO0FBQUUsMkJBQUtELE9BQUw7QUFBaUIsaUJBQXBDLEVBQXNDLEdBQXRDO0FBQ0E7QUFDSDs7QUFFRCxpQkFBS0UsYUFBTCxHQUFxQixLQUFLQyxVQUFMLENBQWdCOUMseUJBQXlCLGNBQXpDLENBQXJCO0FBQ0EsaUJBQUsrQyxZQUFMLEdBQW9CLEtBQUtELFVBQUwsQ0FBZ0I5Qyx5QkFBeUIsYUFBekMsQ0FBcEI7QUFDQSxpQkFBS2dELFlBQUwsR0FBb0IsS0FBS0QsWUFBekI7O0FBRUEsaUJBQUtqRCxHQUFMLEdBQVcsSUFBSUksRUFBRUosR0FBTixDQUFVc0IsT0FBTyx5QkFBUCxFQUFrQzZCLEdBQWxDLENBQXNDLENBQXRDLENBQVYsRUFBb0Q7QUFDM0Qsd0JBQVEsRUFEbUQ7QUFFM0QsMEJBQVUsQ0FBQyxNQUFELEVBQVMsQ0FBQyxJQUFWO0FBRmlELGFBQXBELENBQVg7O0FBS0EvQyxjQUFFZ0QsU0FBRixDQUFZLG9EQUFaLEVBQWtFO0FBQzlELCtCQUFlO0FBRCtDLGFBQWxFLEVBRUdDLEtBRkgsQ0FFUyxLQUFLckQsR0FGZDtBQUdIOzs7dUNBRWM7QUFDWCxnQkFBSSxLQUFLRCxPQUFMLENBQWEyQixNQUFiLEdBQXNCLENBQTFCLEVBQTZCO0FBQ3pCLHFCQUFLLElBQUk0QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyx5QkFBS3RELEdBQUwsQ0FBU3VELFdBQVQsQ0FBcUIsS0FBS3hELE9BQUwsQ0FBYXVELENBQWIsQ0FBckI7QUFDSDtBQUNKO0FBQ0QsaUJBQUt2RCxPQUFMLEdBQWUsRUFBZjtBQUNIOztBQUdEOzs7Ozs7OzttQ0FLV3lELFksRUFBY0MsUSxFQUFVO0FBQUE7O0FBQy9CLGlCQUFLRCxZQUFMLEdBQW9CQSxZQUFwQjs7QUFEK0IsdUNBR3RCRSxDQUhzQjtBQUkzQix1QkFBSzNELE9BQUwsQ0FBYTJELENBQWIsSUFBa0IsT0FBS0MsU0FBTCxDQUFlSCxhQUFhRSxDQUFiLENBQWYsQ0FBbEI7QUFDQTtBQUNBLHVCQUFLRixZQUFMLENBQWtCRSxDQUFsQixFQUFxQkUsTUFBckIsR0FBOEIsT0FBSzdELE9BQUwsQ0FBYTJELENBQWIsQ0FBOUI7O0FBRUEsdUJBQUszRCxPQUFMLENBQWEyRCxDQUFiLEVBQWdCRyxFQUFoQixDQUFtQixPQUFuQixFQUE0QixZQUFNO0FBQzlCLHdCQUFHLE9BQU9KLFFBQVAsSUFBb0IsVUFBdkIsRUFBa0M7QUFDOUJBLGlDQUFTQyxDQUFUO0FBQ0g7QUFDSixpQkFKRDtBQVIyQjs7QUFHL0IsaUJBQUssSUFBSUEsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixhQUFhOUIsTUFBakMsRUFBeUMsRUFBRWdDLENBQTNDLEVBQThDO0FBQUEsc0JBQXJDQSxDQUFxQztBQVU3Qzs7QUFFRCxpQkFBS0ksU0FBTDtBQUNIOzs7b0NBRVdGLE0sRUFBUTtBQUNoQkEsbUJBQU9HLE9BQVAsQ0FBZSxLQUFLZCxZQUFwQjtBQUNIOzs7cUNBRVlXLE0sRUFBUTtBQUNqQkEsbUJBQU9HLE9BQVAsQ0FBZSxLQUFLaEIsYUFBcEI7QUFDSDs7QUFFRDs7Ozs7Ozs7O29DQU1ZO0FBQUE7O0FBQ1IsZ0JBQUlpQixhQUFhLENBQUMsS0FBS1IsWUFBTCxDQUFrQixDQUFsQixFQUFxQlMsR0FBdEIsRUFBMkIsS0FBS1QsWUFBTCxDQUFrQixDQUFsQixFQUFxQlUsSUFBaEQsQ0FBakI7QUFDQSxnQkFBSUMsV0FBVyxDQUFDLEtBQUtYLFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUJTLEdBQXRCLEVBQTJCLEtBQUtULFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUJVLElBQWhELENBQWY7O0FBRUEsaUJBQUssSUFBSVosSUFBSSxDQUFiLEVBQWdCQSxJQUFJLEtBQUtFLFlBQUwsQ0FBa0I5QixNQUF0QyxFQUE4QyxFQUFFNEIsQ0FBaEQsRUFBbUQ7QUFDL0Msb0JBQUk1QyxNQUFNLEtBQUs4QyxZQUFMLENBQWtCRixDQUFsQixFQUFxQlcsR0FBL0I7QUFDQSxvQkFBSXRELE1BQU0sS0FBSzZDLFlBQUwsQ0FBa0JGLENBQWxCLEVBQXFCWSxJQUEvQjs7QUFFQSxvQkFBSXhELE1BQU1zRCxXQUFXLENBQVgsQ0FBVixFQUF5QjtBQUNyQkEsK0JBQVcsQ0FBWCxJQUFnQnRELEdBQWhCO0FBQ0g7O0FBRUQsb0JBQUlBLE1BQU15RCxTQUFTLENBQVQsQ0FBVixFQUF1QjtBQUNuQkEsNkJBQVMsQ0FBVCxJQUFjekQsR0FBZDtBQUNIOztBQUVELG9CQUFJQyxNQUFNd0QsU0FBUyxDQUFULENBQVYsRUFBdUI7QUFDbkJBLDZCQUFTLENBQVQsSUFBY3hELEdBQWQ7QUFDSDs7QUFFRCxvQkFBSUEsTUFBTXFELFdBQVcsQ0FBWCxDQUFWLEVBQXlCO0FBQ3JCQSwrQkFBVyxDQUFYLElBQWdCckQsR0FBaEI7QUFDSDtBQUNKOztBQUdELGdCQUFJeUQsVUFBVUMsV0FBV0wsV0FBVyxDQUFYLENBQVgsSUFBNEIsQ0FBQ0ssV0FBV0YsU0FBUyxDQUFULENBQVgsSUFBMEJFLFdBQVdMLFdBQVcsQ0FBWCxDQUFYLENBQTNCLElBQXdELENBQWxHO0FBQ0EsZ0JBQUlNLFVBQVVELFdBQVdMLFdBQVcsQ0FBWCxDQUFYLElBQTRCLENBQUNLLFdBQVdGLFNBQVMsQ0FBVCxDQUFYLElBQTBCRSxXQUFXTCxXQUFXLENBQVgsQ0FBWCxDQUEzQixJQUF3RCxDQUFsRzs7QUFFQSxpQkFBS2hFLEdBQUwsQ0FBU3VFLEtBQVQsQ0FBZSxDQUFDSCxPQUFELEVBQVVFLE9BQVYsQ0FBZjs7QUFFQSxpQkFBS3RFLEdBQUwsQ0FBUzhELFNBQVQsQ0FBbUIsQ0FDZkUsVUFEZSxFQUVmRyxRQUZlLENBQW5COztBQUtBckIsdUJBQVksWUFBTTtBQUFFLHVCQUFLOUMsR0FBTCxDQUFTd0UsY0FBVDtBQUEwQixhQUE5QyxFQUFnRCxHQUFoRDtBQUNIOztBQUVEOzs7Ozs7Ozs7a0NBTVVDLFcsRUFBYTtBQUNuQixnQkFBSWIsU0FBU3hELEVBQUV3RCxNQUFGLENBQVMsQ0FBQ2EsWUFBWVIsR0FBYixFQUFrQlEsWUFBWVAsSUFBOUIsQ0FBVCxFQUE4QztBQUN2RCx3QkFBUSxLQUFLaEIsWUFEMEM7QUFFdkQseUJBQVN1QixZQUFZQyxXQUFaLENBQXdCQyxJQUF4QixHQUErQixJQUEvQixHQUFzQ0YsWUFBWUMsV0FBWixDQUF3QnJDO0FBRmhCLGFBQTlDLENBQWI7QUFJQXVCLG1CQUFPUCxLQUFQLENBQWEsS0FBS3JELEdBQWxCO0FBQ0EsbUJBQU80RCxNQUFQO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7dUNBT2VnQixVLEVBQVk7QUFBQTs7QUFDdkIsZ0JBQUksT0FBT3hFLENBQVAsSUFBYSxXQUFqQixFQUE4QjtBQUMxQjBDLDJCQUFXLFlBQU07QUFBRSwyQkFBSytCLGNBQUwsQ0FBb0JELFVBQXBCO0FBQWtDLGlCQUFyRCxFQUF1RCxHQUF2RDtBQUNBO0FBQ0g7QUFDRCxnQkFBSUUsbUJBQW1CLEtBQUs3RSxXQUFMLEdBQW1CLEVBQW5CLEdBQXdCMkUsVUFBeEIsR0FBcUMsTUFBNUQ7QUFDQTtBQUNBLGlCQUFLMUIsWUFBTCxHQUFvQixLQUFLRixVQUFMLENBQWdCOEIsZ0JBQWhCLENBQXBCO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzBDQUtrQkMsRyxFQUFLO0FBQ25CLGlCQUFLLElBQUl6QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0lnQixPQUFPekIsQ0FBUCxHQUNBLEtBQUtQLGFBREwsR0FFQSxLQUFLRyxZQUhUO0FBS0g7QUFDSjs7Ozs7O2tCQS9RZ0JyRCxpQiIsImZpbGUiOiIuL2pzL3NoaXB0aW1pemUtb3Blbi1tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi9zaGlwdGltaXplLXV0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZU9wZW5NYXAge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMubWFwID0gbnVsbDtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyBzaGlwdGltaXplX2ljb25fZm9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBpbWFnZVVybCAtIGZ1bGwgdXJsIHRvIHRoZSBpY29uIFxuICAgICAqIEByZXR1cm4gTC5pY29uIG9iamVjdCBcbiAgICAgKi9cbiAgICBjcmVhdGVJY29uKGltYWdlVXJsKSB7XG4gICAgICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICAgICAgICBpY29uVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgIGljb25TaXplOiBbNTAsIDUwXSwgLy8gc2l6ZSBvZiB0aGUgaWNvbiBcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsyNSwgMjVdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb24gXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWy0yNSwgLTUwXSAvLyBwb2ludCBmcm9tIHdoaWNoIHRoZSBwb3B1cCBzaG91bGQgb3BlbiByZWxhdGl2ZSB0byB0aGUgaWNvbkFuY2hvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIGRlY2ltYWwgbGF0IFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxuZyBcbiAgICAgKi8gXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKXtcbiAgICAgICAgbGV0IGxhdGxuZyA9IEwubGF0TG5nKGxhdCwgbG5nKTsgIFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0LiBcbiAgICAgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBsb2FkIHRoZSBzY3JpcHQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBncmFudFJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gZl9jYWxsYmFjayB3aGF0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCByZXNvbHZlcyBcbiAgICogQHBhcmFtIGNpdHkgLSBjaXR5IG5hbWUgXG4gICAqIEBwYXJhbSBjb3VudHJ5IC0gY291bnRyeSBpbiBpc28yIHVwcGVyY2FzZSBcbiAgICogQHBhcmFtIHBvc3RhbGNvZGUgLSB0aGUgcG9zdGFsIGNvZGUgXG4gICAqIEBwYXJhbSBzdHJlZXRuYW1lIC0gdGhlIHN0cmVldG5hbWUgXG4gICAqL1xuICBnZW9jb2RlQWRkcmVzcyhmX2NhbGxiYWNrLCBjaXR5LCBjb3VudHJ5LCBwb3N0YWxjb2RlLCBzdHJlZXRuYW1lKSB7XG4gICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/Zm9ybWF0PWpzb24mYWRkcmVzc2RldGFpbHM9MVwiICtcbiAgICAgIFwiJmNpdHk9XCIgKyBjaXR5ICtcbiAgICAgIFwiJmNvdW50cnk9XCIgKyBjb3VudHJ5O1xuXG4gICAgaWYgKHR5cGVvZiAocG9zdGFsY29kZSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChjb3VudHJ5ID09ICdQVCcgfHwgY291bnRyeSA9PSAnUG9ydHVnYWwnKSB7XG4gICAgICAgIHBvc3RhbGNvZGUgPSBwb3N0YWxjb2RlLnN1YnN0cigwLCA0KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5U3RyaW5nICs9IFwiJnBvc3RhbGNvZGU9XCIgKyBwb3N0YWxjb2RlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKHN0cmVldG5hbWUpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBxdWVyeVN0cmluZyArPSBcIiZzdHJlZXQ9XCIgKyBzdHJlZXRuYW1lO1xuICAgIH1cblxuICAgIGpRdWVyeS5nZXRKU09OKHF1ZXJ5U3RyaW5nLCB7fSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBsZXQgZ2VvY29kZSA9IHtcbiAgICAgICAgJ2lzbzInOiAnJyxcbiAgICAgICAgJ2xhdCc6ICcnLFxuICAgICAgICAnbG5nJzogJydcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlWzBdO1xuXG4gICAgICAgIGdlb2NvZGUuaXNvMiA9IGxvY2F0aW9uLmFkZHJlc3MuY291bnRyeV9jb2RlO1xuXG4gICAgICAgIGdlb2NvZGUubGF0ID0gbG9jYXRpb24ubGF0O1xuICAgICAgICBnZW9jb2RlLmxuZyA9IGxvY2F0aW9uLmxvbjtcbiAgICAgIH1cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogIFxuICAgKiBAcGFyYW0gc2hpcHBpbmdEYXRhLCB0aGUgYWRkcmVzcyBwYXJ0cyAgICAgICBcbiAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAqL1xuICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgZl9jYWxsYmFjaykge1xuICAgIGNvbnNvbGUubG9nKHNoaXBwaW5nRGF0YSk7XG4gICAgdGhpcy5ncmFudFJlYWR5KCk7XG5cbiAgICB0aGlzLmdlb2NvZGVBZGRyZXNzKChnZW9jb2RlKSA9PiB7XG4gICAgICBpZiAoIWdlb2NvZGUubGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2NvZGVBZGRyZXNzKGZ1bmN0aW9uIChnZW9jb2RlKSB7XG4gICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSk7XG4gICAgICB9XG5cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuUG9zdGFsQ29kZSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEpO1xuICB9XG4gICAgbG9hZFNjcmlwdCgpIHtcbiAgICAgICAgVXRpbHMuaW5qZWN0RXh0ZXJuYWxTY3JpcHQoU0hJUFRJTUlaRV9QTFVHSU5fVVJMICsgXCJhc3NldHMvanMvbGVhZmxldC0xLjQuMC5qc1wiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZE1hcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExlYWZsZXQgZG9lcyBub3QgcmVjZWl2ZSBhIGNhbGxiYWNrIHNvIHdlIHdhaXQgaGVyZSBmb3IgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZihMKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMubG9hZE1hcCgpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pY29uX3NlbGVjdGVkID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnc2VsZWN0ZWQucG5nJyk7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnZGVmYXVsdC5wbmcnKTtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDtcblxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBMLm1hcChqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCksIHtcbiAgICAgICAgICAgIFwiem9vbVwiOiAxNixcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IFs1MS41MDUsIC0wLjA5XVxuICAgICAgICB9KTtcblxuICAgICAgICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XG4gICAgICAgICAgICBcImF0dHJpYnV0aW9uXCI6ICcmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMubWFya2Vyc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50czsgXG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwaWNrdXBQb2ludHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XSA9IHRoaXMuZ2V0TWFya2VyKHBpY2t1cFBvaW50c1t4XSk7XG4gICAgICAgICAgICAvLyAgICB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciBsYXQsbG5nIHdlIGhhdmUgYXJlIHJvdW5kZWQsIHNvIHRoZXkgd2lsbCBub3QgbWF0Y2ggdGhlIG9uZXMgcmV0dXJuZWQgYnkgZ29vZ2xlXG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSA9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJlc2V0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgc2VsZWN0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGp1c3QgdGhlIHpvb20gaW4gdGhlIG1hcCB0byBkaXNwbGF5IGFsbCB0aGUgbWFya2VycyBcbiAgICAgKiBUaGVyZSdzIGEgZml0IGJvdW5kcyB0aGF0IHJlY2VpdmVzIDIgY29ybmVycywgYnV0IGNhbGN1bGF0aW5nIHRoZW0gaXMgdXAgdG8gdXMuIFxuICAgICAqIGNvcm5lcnM6IHRvcCBsZWZ0LCBib3R0b20gcmlnaHQgICAgIFxuICAgICAqIHRoZW4gd2UgY2VudGVyIHRoZSBtYXAgYXQgdGhlIGNlbnRlciBvZiB0aGUgc3F1YXJlICBcbiAgICAgKi9cbiAgICBmaXRCb3VuZHMoKSB7XG4gICAgICAgIGxldCBib3R0b21MZWZ0ID0gW3RoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMF0uTG9uZ107XG4gICAgICAgIGxldCB0b3BSaWdodCA9IFt0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzBdLkxvbmddO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waWNrdXBQb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBsYXQgPSB0aGlzLnBpY2t1cFBvaW50c1tpXS5MYXQ7XG4gICAgICAgICAgICBsZXQgbG5nID0gdGhpcy5waWNrdXBQb2ludHNbaV0uTG9uZztcblxuICAgICAgICAgICAgaWYgKGxhdCA8IGJvdHRvbUxlZnRbMF0pIHtcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0WzBdID0gbGF0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF0ID4gdG9wUmlnaHRbMF0pIHtcbiAgICAgICAgICAgICAgICB0b3BSaWdodFswXSA9IGxhdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxuZyA+IHRvcFJpZ2h0WzFdKSB7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHRbMV0gPSBsbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsbmcgPCBib3R0b21MZWZ0WzFdKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdFsxXSA9IGxuZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGNlbnRlclggPSBwYXJzZUZsb2F0KGJvdHRvbUxlZnRbMF0pICsgKHBhcnNlRmxvYXQodG9wUmlnaHRbMF0pIC0gcGFyc2VGbG9hdChib3R0b21MZWZ0WzBdKSkgLyAyO1xuICAgICAgICBsZXQgY2VudGVyWSA9IHBhcnNlRmxvYXQoYm90dG9tTGVmdFsxXSkgKyAocGFyc2VGbG9hdCh0b3BSaWdodFsxXSkgLSBwYXJzZUZsb2F0KGJvdHRvbUxlZnRbMV0pKSAvIDI7XG5cbiAgICAgICAgdGhpcy5tYXAucGFuVG8oW2NlbnRlclgsIGNlbnRlclldKTtcblxuICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoW1xuICAgICAgICAgICAgYm90dG9tTGVmdCxcbiAgICAgICAgICAgIHRvcFJpZ2h0XG4gICAgICAgIF0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKX0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIG9wZW5MYXllcnMgXG4gICAgICogSWNvbkFuY2hvcjogVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBcInRpcFwiIG9mIHRoZSBpY29uIChyZWxhdGl2ZSB0byBpdHMgdG9wIGxlZnQgY29ybmVyKS4gXG4gICAgICogVGhlIGljb24gd2lsbCBiZSBhbGlnbmVkIHNvIHRoYXQgdGhpcyBwb2ludCBpcyBhdCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLiBcbiAgICAgKiBDZW50ZXJlZCBieSBkZWZhdWx0IGlmIHNpemUgaXMgc3BlY2lmaWVkLCBhbHNvIGNhbiBiZSBzZXQgaW4gQ1NTIHdpdGggbmVnYXRpdmUgbWFyZ2lucy5cbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQpIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKFtwaWNrdXBQb2ludC5MYXQsIHBpY2t1cFBvaW50LkxvbmddLCB7XG4gICAgICAgICAgICBcImljb25cIjogdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICBcInRpdGxlXCI6IHBpY2t1cFBvaW50LkluZm9ybWF0aW9uLk5hbWUgKyBcIlxcblwiICsgcGlja3VwUG9pbnQuSW5mb3JtYXRpb24uQWRkcmVzc1xuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyLmFkZFRvKHRoaXMubWFwKTtcbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi9cbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKSB7XG4gICAgICAgIGlmICh0eXBlb2YoTCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNldENhcnJpZXJJY29uKGNhcnJpZXJfaWQpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlciArICcnICsgY2Fycmllcl9pZCArICcucG5nJztcbiAgICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCkgOiB0aGlzLmljb25fZGVmYXVsdDtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldEljb24oXG4gICAgICAgICAgICAgICAgaWR4ID09IGkgP1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2ljb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-open-map.js\n");
     121
     122/***/ }),
     123
     124/***/ "./js/shiptimize-utils.js":
     125/*!********************************!*\
     126  !*** ./js/shiptimize-utils.js ***!
     127  \********************************/
     128/*! no static exports found */
     129/***/ (function(module, exports, __webpack_require__) {
     130
     131"use strict";
     132eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n  function ShiptimizeUtils() {\n    _classCallCheck(this, ShiptimizeUtils);\n  }\n\n  /** \n   * Inject Script into the page \n   * @param string src \n   */\n\n\n  _createClass(ShiptimizeUtils, [{\n    key: \"injectExternalScript\",\n    value: function injectExternalScript(src) {\n      var s = document.createElement(\"script\");\n      s.setAttribute(\"src\", src);\n      document.body.appendChild(s);\n    }\n\n    /** \n     * Inject a script string \n     */\n\n  }, {\n    key: \"injectScript\",\n    value: function injectScript(contents) {\n      var e = document.createElement(\"script\");\n      e.value = contents;\n      document.body.appendChild(e);\n    }\n\n    /** \n     * Removes all not numeric chars from the string \n     *\n     * @param string string - the input string \n     * @return the string without chars that are not numbers \n     */\n\n  }, {\n    key: \"removeNonNumeric\",\n    value: function removeNonNumeric(string) {\n      return string.replace(/\\D/g, '');\n    }\n\n    /** \n     * Check if the given url exists and is valid\n     * We use this to check if the carrier icon exists given \n     * a url path and the naming convention {carrier_id}.svg \n     * Make sure the correct protocol is appended to the url http != https \n     * \n     * @return true it the url exists and is valid \n     */\n\n  }, {\n    key: \"isUrlValid\",\n    value: function isUrlValid(url) {\n      var http = new XMLHttpRequest();\n      http.open('HEAD', url, false);\n      http.send();\n      return http.status == 200;\n    }\n\n    /** \n     * Open a new window with the provided URL \n     * @string url \n     * @return bool if the window was opened, false if popup blocker enabled \n     */\n\n  }, {\n    key: \"openNewWindow\",\n    value: function openNewWindow(url, options) {\n      var newWin = window.open(url, '_blank', options);\n      var blocked = !newWin || newWin.closed || typeof newWin.closed == 'undefined';\n\n      return !blocked;\n    }\n  }]);\n\n  return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS11dGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2UgY2FuIHVzZSBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3R1ZmYgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemVVdGlscyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBTY3JpcHQgaW50byB0aGUgcGFnZSBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHNyYyBcbiAgICAgKi9cbiAgICBpbmplY3RFeHRlcm5hbFNjcmlwdChzcmMpIHtcbiAgICAgICAgbGV0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBhIHNjcmlwdCBzdHJpbmcgXG4gICAgICovXG4gICAgaW5qZWN0U2NyaXB0KGNvbnRlbnRzKSB7XG4gICAgICAgIGxldCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgZS52YWx1ZSA9IGNvbnRlbnRzO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZW1vdmVzIGFsbCBub3QgbnVtZXJpYyBjaGFycyBmcm9tIHRoZSBzdHJpbmcgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgXG4gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhcnMgdGhhdCBhcmUgbm90IG51bWJlcnMgXG4gICAgICovXG4gICAgcmVtb3ZlTm9uTnVtZXJpYyhzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICAgKiBXZSB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgY2FycmllciBpY29uIGV4aXN0cyBnaXZlbiBcbiAgICAgKiBhIHVybCBwYXRoIGFuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24ge2NhcnJpZXJfaWR9LnN2ZyBcbiAgICAgKiBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgcHJvdG9jb2wgaXMgYXBwZW5kZWQgdG8gdGhlIHVybCBodHRwICE9IGh0dHBzIFxuICAgICAqIFxuICAgICAqIEByZXR1cm4gdHJ1ZSBpdCB0aGUgdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWQgXG4gICAgICovIFxuICAgIGlzVXJsVmFsaWQodXJsKSB7XG4gICAgICAgIHZhciBodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHAub3BlbignSEVBRCcsIHVybCwgZmFsc2UpO1xuICAgICAgICBodHRwLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuIGh0dHAuc3RhdHVzID09IDIwMDtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogT3BlbiBhIG5ldyB3aW5kb3cgd2l0aCB0aGUgcHJvdmlkZWQgVVJMIFxuICAgICAqIEBzdHJpbmcgdXJsIFxuICAgICAqIEByZXR1cm4gYm9vbCBpZiB0aGUgd2luZG93IHdhcyBvcGVuZWQsIGZhbHNlIGlmIHBvcHVwIGJsb2NrZXIgZW5hYmxlZCBcbiAgICAgKi8gIFxuICAgIG9wZW5OZXdXaW5kb3codXJsLCBvcHRpb25zKXtcbiAgICAgICAgbGV0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsIG9wdGlvbnMpOyBcbiAgICAgICAgbGV0IGJsb2NrZWQgPSAhbmV3V2luIHx8IG5ld1dpbi5jbG9zZWQgfHwgdHlwZW9mIG5ld1dpbi5jbG9zZWQ9PSd1bmRlZmluZWQnOyBcblxuICAgICAgICByZXR1cm4gIWJsb2NrZWQ7IFxuICAgIH1cbn1cblxuXG5sZXQgdXRpbHMgPSBuZXcgU2hpcHRpbWl6ZVV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlsczsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-utils.js\n");
     133
     134/***/ }),
     135
     136/***/ "./js/shiptimize-woo-commerce.js":
     137/*!***************************************!*\
     138  !*** ./js/shiptimize-woo-commerce.js ***!
     139  \***************************************/
     140/*! no static exports found */
     141/***/ (function(module, exports, __webpack_require__) {
     142
     143"use strict";
     144eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Woocommerce = function () {\n    function Woocommerce(ajax_url) {\n        _classCallCheck(this, Woocommerce);\n\n        this.ajax_url = ajax_url;\n    }\n\n    /** \n     * @return true if this is the checkout page \n     */\n\n\n    _createClass(Woocommerce, [{\n        key: 'isCheckout',\n        value: function isCheckout() {\n            return jQuery(\"body\").hasClass('woocommerce-checkout');\n        }\n\n        /* \n         * If there is only one method available woo will use a hidden field for the selected carrier \n         *  + Generic Methods do not have an instance id \n         */\n\n    }, {\n        key: 'getShippingMethodId',\n        value: function getShippingMethodId() {\n\n            var eCheckbox = jQuery(\"input[name='shipping_method[0]']:checked\");\n            var eHidden = jQuery(\"input[name='shipping_method[0]']\");\n\n            var shippingMethod = eCheckbox.length > 0 ? eCheckbox.val() : eHidden.val();\n\n            if (shippingMethod.indexOf(':') > 0) {\n                var method_parts = shippingMethod.split(':');\n                return _shiptimizeUtils2.default.removeNonNumeric(method_parts[0]);\n            } else {\n                return shippingMethod;\n            }\n        }\n\n        /** \n         * Wordpress won't send session cookies to wp-admin and the session handling in woocommerce is so poorly documented we are better off \n         * extracting necessary info client side our selves. We're emulating their checkout.js \n         * @return an object containing address parts \n         */\n\n    }, {\n        key: 'getShippingData',\n        value: function getShippingData() {\n\n            var country = jQuery('#billing_country').val(),\n                state = jQuery('#billing_state').val(),\n                postcode = jQuery('input#billing_postcode').val(),\n                city = jQuery('#billing_city').val(),\n                address = jQuery('input#billing_address_1').val(),\n                address_2 = jQuery('input#billing_address_2').val(),\n                s_country = country,\n                s_state = state,\n                s_postcode = postcode,\n                s_city = city,\n                s_address = address,\n                s_address_2 = address_2;\n\n            if (jQuery('#ship-to-different-address').find('input').is(':checked')) {\n                s_country = jQuery('#shipping_country').val();\n                s_state = jQuery('#shipping_state').val();\n                s_postcode = jQuery('input#shipping_postcode').val();\n                s_city = jQuery('#shipping_city').val();\n                s_address = jQuery('input#shipping_address_1').val();\n                s_address_2 = jQuery('input#shipping_address_2').val();\n            }\n\n            return {\n                \"Address\": {\n                    \"Lat\": \"\",\n                    \"Long\": \"\",\n                    \"Streetname1\": s_address,\n                    \"Streetname2\": s_address_2,\n                    \"HouseNumber\": '',\n                    \"NumberExtension\": '',\n                    \"PostalCode\": s_postcode,\n                    \"s_postcode\": s_postcode,\n                    \"City\": s_city,\n                    \"Country\": s_country,\n                    \"State\": s_state\n\n                },\n                post_data: jQuery('form.checkout').serialize(),\n                \"CarrierId\": this.carrier_id\n            };\n        }\n\n        /** \n         * We must run this onload \n         * And on method change \n         * because people may never change the carrier or select a pickup point \n         */\n\n    }, {\n        key: 'setCarrier',\n        value: function setCarrier(carrier_id) {\n            this.carrier_id = typeof carrier_id != 'undefined' ? carrier_id : this.getShippingMethodId();\n            jQuery(\"#shipping_carrier_id\").val(this.carrier_id);\n        }\n\n        /** \n         * @param Pickup pickup \n         */\n\n    }, {\n        key: 'setPickupPoint',\n        value: function setPickupPoint(pickup) {\n            var pickup_label = pickup.Information.Name + \" \" + pickup.Information.Address;\n\n            jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup_label);\n            jQuery(\"#shipping_pickup_id\").val(pickup.PointId);\n            jQuery(\"#shipping_pickup_label\").val(pickup_label);\n\n            jQuery(\"#shiptimizepickup\").val(pickup.PointId);\n        }\n    }]);\n\n    return Woocommerce;\n}();\n\nexports.default = Woocommerce;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcz8yY2Y5Il0sIm5hbWVzIjpbIldvb2NvbW1lcmNlIiwiYWpheF91cmwiLCJqUXVlcnkiLCJoYXNDbGFzcyIsImVDaGVja2JveCIsImVIaWRkZW4iLCJzaGlwcGluZ01ldGhvZCIsImxlbmd0aCIsInZhbCIsImluZGV4T2YiLCJtZXRob2RfcGFydHMiLCJzcGxpdCIsIlV0aWxzIiwicmVtb3ZlTm9uTnVtZXJpYyIsImNvdW50cnkiLCJzdGF0ZSIsInBvc3Rjb2RlIiwiY2l0eSIsImFkZHJlc3MiLCJhZGRyZXNzXzIiLCJzX2NvdW50cnkiLCJzX3N0YXRlIiwic19wb3N0Y29kZSIsInNfY2l0eSIsInNfYWRkcmVzcyIsInNfYWRkcmVzc18yIiwiZmluZCIsImlzIiwicG9zdF9kYXRhIiwic2VyaWFsaXplIiwiY2Fycmllcl9pZCIsImdldFNoaXBwaW5nTWV0aG9kSWQiLCJwaWNrdXAiLCJwaWNrdXBfbGFiZWwiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwiaHRtbCIsInNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwIiwiUG9pbnRJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLFc7QUFFakIseUJBQVlDLFFBQVosRUFBc0I7QUFBQTs7QUFDbEIsYUFBS0EsUUFBTCxHQUFnQkEsUUFBaEI7QUFDSDs7QUFFRDs7Ozs7OztxQ0FHYTtBQUNULG1CQUFPQyxPQUFPLE1BQVAsRUFBZUMsUUFBZixDQUF3QixzQkFBeEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7OzhDQUlxQjs7QUFFakIsZ0JBQUlDLFlBQVlGLE9BQU8sMENBQVAsQ0FBaEI7QUFDQSxnQkFBSUcsVUFBVUgsT0FBTyxrQ0FBUCxDQUFkOztBQUVBLGdCQUFJSSxpQkFBa0JGLFVBQVVHLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUJILFVBQVVJLEdBQVYsRUFBdkIsR0FBeUNILFFBQVFHLEdBQVIs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Ozs7a0JBMUdnQnZDLFciLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vY29tbWVyY2Uge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgY2hlY2tvdXQgcGFnZSBcbiAgICAgKi9cbiAgICBpc0NoZWNrb3V0KCkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KFwiYm9keVwiKS5oYXNDbGFzcygnd29vY29tbWVyY2UtY2hlY2tvdXQnKTtcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgYXZhaWxhYmxlIHdvbyB3aWxsIHVzZSBhIGhpZGRlbiBmaWVsZCBmb3IgdGhlIHNlbGVjdGVkIGNhcnJpZXIgXG4gICAgICogICsgR2VuZXJpYyBNZXRob2RzIGRvIG5vdCBoYXZlIGFuIGluc3RhbmNlIGlkIFxuICAgICAqLyBcbiAgICBnZXRTaGlwcGluZ01ldGhvZElkKCl7XG5cbiAgICAgICAgbGV0IGVDaGVja2JveCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddOmNoZWNrZWRcIik7IFxuICAgICAgICBsZXQgZUhpZGRlbiA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddXCIpOyBcblxuICAgICAgICBsZXQgc2hpcHBpbmdNZXRob2QgPSAgZUNoZWNrYm94Lmxlbmd0aCA+IDAgPyBlQ2hlY2tib3gudmFsKCkgOiBlSGlkZGVuLnZhbCgpIDsgXG5cbiAgICAgICAgaWYgKCBzaGlwcGluZ01ldGhvZC5pbmRleE9mKCc6JykgPiAwICl7XG4gICAgICAgICAgICB2YXIgbWV0aG9kX3BhcnRzID0gc2hpcHBpbmdNZXRob2Quc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5yZW1vdmVOb25OdW1lcmljKG1ldGhvZF9wYXJ0c1swXSk7ICAgICBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIFxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gc2hpcHBpbmdNZXRob2Q7XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdvcmRwcmVzcyB3b24ndCBzZW5kIHNlc3Npb24gY29va2llcyB0byB3cC1hZG1pbiBhbmQgdGhlIHNlc3Npb24gaGFuZGxpbmcgaW4gd29vY29tbWVyY2UgaXMgc28gcG9vcmx5IGRvY3VtZW50ZWQgd2UgYXJlIGJldHRlciBvZmYgXG4gICAgICogZXh0cmFjdGluZyBuZWNlc3NhcnkgaW5mbyBjbGllbnQgc2lkZSBvdXIgc2VsdmVzLiBXZSdyZSBlbXVsYXRpbmcgdGhlaXIgY2hlY2tvdXQuanMgXG4gICAgICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzIHBhcnRzIFxuICAgICAqL1xuICAgIGdldFNoaXBwaW5nRGF0YSgpIHtcblxuICAgICAgICB2YXIgY291bnRyeSA9IGpRdWVyeSgnI2JpbGxpbmdfY291bnRyeScpLnZhbCgpLFxuICAgICAgICAgICAgc3RhdGUgPSBqUXVlcnkoJyNiaWxsaW5nX3N0YXRlJykudmFsKCksXG4gICAgICAgICAgICBwb3N0Y29kZSA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19wb3N0Y29kZScpLnZhbCgpLFxuICAgICAgICAgICAgY2l0eSA9IGpRdWVyeSgnI2JpbGxpbmdfY2l0eScpLnZhbCgpLFxuICAgICAgICAgICAgYWRkcmVzcyA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzEnKS52YWwoKSxcbiAgICAgICAgICAgIGFkZHJlc3NfMiA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzInKS52YWwoKSxcbiAgICAgICAgICAgIHNfY291bnRyeSA9IGNvdW50cnksXG4gICAgICAgICAgICBzX3N0YXRlID0gc3RhdGUsXG4gICAgICAgICAgICBzX3Bvc3Rjb2RlID0gcG9zdGNvZGUsXG4gICAgICAgICAgICBzX2NpdHkgPSBjaXR5LFxuICAgICAgICAgICAgc19hZGRyZXNzID0gYWRkcmVzcyxcbiAgICAgICAgICAgIHNfYWRkcmVzc18yID0gYWRkcmVzc18yO1xuXG5cbiAgICAgICAgaWYgKGpRdWVyeSgnI3NoaXAtdG8tZGlmZmVyZW50LWFkZHJlc3MnKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBzX2NvdW50cnkgPSBqUXVlcnkoJyNzaGlwcGluZ19jb3VudHJ5JykudmFsKCk7XG4gICAgICAgICAgICBzX3N0YXRlID0galF1ZXJ5KCcjc2hpcHBpbmdfc3RhdGUnKS52YWwoKTtcbiAgICAgICAgICAgIHNfcG9zdGNvZGUgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX3Bvc3Rjb2RlJykudmFsKCk7XG4gICAgICAgICAgICBzX2NpdHkgPSBqUXVlcnkoJyNzaGlwcGluZ19jaXR5JykudmFsKCk7XG4gICAgICAgICAgICBzX2FkZHJlc3MgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMScpLnZhbCgpO1xuICAgICAgICAgICAgc19hZGRyZXNzXzIgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMicpLnZhbCgpO1xuICAgICAgICB9XG4gXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcIkFkZHJlc3NcIjp7XG4gICAgICAgICAgICAgICAgXCJMYXRcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIkxvbmdcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUxXCI6IHNfYWRkcmVzcyxcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUyXCI6IHNfYWRkcmVzc18yLFxuICAgICAgICAgICAgICAgIFwiSG91c2VOdW1iZXJcIjogJycsXG4gICAgICAgICAgICAgICAgXCJOdW1iZXJFeHRlbnNpb25cIjogJycsXG4gICAgICAgICAgICAgICAgXCJQb3N0YWxDb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJzX3Bvc3Rjb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJDaXR5XCI6IHNfY2l0eSxcbiAgICAgICAgICAgICAgICBcIkNvdW50cnlcIjogc19jb3VudHJ5LFxuICAgICAgICAgICAgICAgIFwiU3RhdGVcIjogc19zdGF0ZSxcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RfZGF0YTogalF1ZXJ5KCdmb3JtLmNoZWNrb3V0Jykuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBcIkNhcnJpZXJJZFwiOiB0aGlzLmNhcnJpZXJfaWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2UgbXVzdCBydW4gdGhpcyBvbmxvYWQgXG4gICAgICogQW5kIG9uIG1ldGhvZCBjaGFuZ2UgXG4gICAgICogYmVjYXVzZSBwZW9wbGUgbWF5IG5ldmVyIGNoYW5nZSB0aGUgY2FycmllciBvciBzZWxlY3QgYSBwaWNrdXAgcG9pbnQgXG4gICAgICovIFxuICAgIHNldENhcnJpZXIoY2Fycmllcl9pZCl7XG4gICAgICAgIHRoaXMuY2Fycmllcl9pZCA9IHR5cGVvZihjYXJyaWVyX2lkKSAhPSAndW5kZWZpbmVkJyA/IGNhcnJpZXJfaWQgOiB0aGlzLmdldFNoaXBwaW5nTWV0aG9kSWQoKTsgIFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfY2Fycmllcl9pZFwiKS52YWwodGhpcy5jYXJyaWVyX2lkKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIFBpY2t1cCBwaWNrdXAgXG4gICAgICovXG4gICAgc2V0UGlja3VwUG9pbnQocGlja3VwKSB7XG4gICAgICAgIGxldCBwaWNrdXBfbGFiZWwgPSAgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzOyBcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICtwaWNrdXBfbGFiZWwpO1xuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfcGlja3VwX2lkXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwcGluZ19waWNrdXBfbGFiZWxcIikudmFsKHBpY2t1cF9sYWJlbCk7IFxuXG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplcGlja3VwXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7IFxuICAgICAgICBcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-woo-commerce.js\n");
     145
     146/***/ }),
     147
     148/***/ "./scss/shiptimize.scss":
     149/*!******************************!*\
     150  !*** ./scss/shiptimize.scss ***!
     151  \******************************/
     152/*! no static exports found */
     153/***/ (function(module, exports, __webpack_require__) {
     154
     155eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUuc2Nzcz9lYzk3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6Ii4vc2Nzcy9zaGlwdGltaXplLnNjc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./scss/shiptimize.scss\n");
     156
     157/***/ }),
     158
     159/***/ "./shiptmize.js":
     160/*!**********************!*\
     161  !*** ./shiptmize.js ***!
     162  \**********************/
     163/*! no static exports found */
     164/***/ (function(module, exports, __webpack_require__) {
     165
     166"use strict";
     167eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(/*! ./scss/shiptimize.scss */ \"./scss/shiptimize.scss\");\n\n__webpack_require__(/*! ./css/leaflet.css */ \"./css/leaflet.css\");\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./js/shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWooCommerce = __webpack_require__(/*! ./js/shiptimize-woo-commerce.js */ \"./js/shiptimize-woo-commerce.js\");\n\nvar _shiptimizeWooCommerce2 = _interopRequireDefault(_shiptimizeWooCommerce);\n\nvar _shiptimizeGmaps = __webpack_require__(/*! ./js/shiptimize-gmaps.js */ \"./js/shiptimize-gmaps.js\");\n\nvar _shiptimizeGmaps2 = _interopRequireDefault(_shiptimizeGmaps);\n\nvar _shiptimizeOpenMap = __webpack_require__(/*! ./js/shiptimize-open-map.js */ \"./js/shiptimize-open-map.js\");\n\nvar _shiptimizeOpenMap2 = _interopRequireDefault(_shiptimizeOpenMap);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Class Shiptimize depends on jQuery. \n * Check if we are meant to append a map \n * \n * Platform dependent functions marked with   * @platformDependent \n */\nvar Shiptimize = function () {\n    function Shiptimize(ajax_url) {\n        _classCallCheck(this, Shiptimize);\n\n        this.markers = []; //pickup {lat, lng} \n        this.isMapLoaded = false;\n        this.gmaps_key = typeof shiptimize_maps_key == 'undefined' ? '' : shiptimize_maps_key;\n        this.openMapMarkerIcons = {};\n        this.ajax_url = ajax_url; // platform dependent \n\n        this.platform = new _shiptimizeWooCommerce2.default(this.ajax_url);\n\n        this.map = this.gmaps_key ? new _shiptimizeGmaps2.default(this.gmaps_key) : new _shiptimizeOpenMap2.default();\n        this.platform.isCheckout();\n        this.map.grantReady();\n    }\n\n    /** \n     * Show the map to the user \n     */\n\n\n    _createClass(Shiptimize, [{\n        key: 'showMap',\n        value: function showMap() {\n            this.userScroll = jQuery('html,body').scrollTop();\n            jQuery('html,body').scrollTop(0);\n            jQuery(\".shiptimize-pickup\").addClass(\"active\");\n        }\n\n        /** \n         * Hide the map   \n         */\n\n    }, {\n        key: 'hideMap',\n        value: function hideMap() {\n            jQuery(\".shiptimize-pickup\").removeClass(\"active\");\n            jQuery(\".shiptimize-pickup__error\").hide();\n            jQuery('html,body').scrollTop(this.userScroll);\n        }\n    }, {\n        key: 'clearMarkers',\n        value: function clearMarkers() {\n            this.map.clearMarkers();\n        }\n\n        /** \n         * Generate the inputs for the user to append extra info if necessary \n         * The id of these fields is in the format shiptimize_extra_{PointId}_{FieldId}\n         */\n\n    }, {\n        key: 'getExtendedInfoHtml',\n        value: function getExtendedInfoHtml(pickupPoint) {\n            if (!pickupPoint.ExtendedInfo || typeof pickupPoint.ExtendedInfo.length == 'undefined') {\n                return \"\";\n            }\n\n            var html = '';\n\n            for (var x = 0; pickupPoint.ExtendedInfo && x < pickupPoint.ExtendedInfo.length; ++x) {\n                var extraInfo = pickupPoint.ExtendedInfo[x];\n                html += '<div class=\"shiptimize-pickup__extended\">' + '<label class=\"shiptimize-pickup__extended_label \">' + extraInfo.Tekst + '</label>' + '<input type=\"text\" name=\"shiptimize_pickup_extended_value\" value=\"\" id=\"shiptimize_extra_' + pickupPoint.PointId + '_' + extraInfo.FieldId + '\"/> ' + '<input type=\"hidden\" name=\"shiptimize_pickup_extended_id\" id=\"shiptimize_pickup\" value=\"' + extraInfo.FieldId + '\"/> ' + '</div>';\n            }\n\n            return html;\n        }\n\n        /**\n         * Reset all markers  \n         * Select the marker of index idx in map \n         */\n\n    }, {\n        key: 'selectPointFromListInMap',\n        value: function selectPointFromListInMap(idx) {\n            jQuery(\"input[name='shiptimize__point']\").prop('checked', false);\n            this.map.selectMarkerByIdx(idx);\n\n            jQuery(jQuery(\"input[name='shiptimize__point']\").get(idx)).prop('checked', true);\n        }\n\n        /** \n         * When the user clicks the validate button \n         */\n\n    }, {\n        key: 'selectFromList',\n        value: function selectFromList() {\n            var idx = jQuery(\"input[name='shiptimize__point']:checked\").val();\n            var pickup = this.pickupPoints[idx];\n            var extra = '';\n\n            for (var i = 0; pickup.ExtendedInfo && i < pickup.ExtendedInfo.length; ++i) {\n                extra += \"<br/>\" + pickup.ExtendedInfo[i].Tekst + ': ' + jQuery(\"#shiptimize_extra_\" + pickup.PointId + \"_\" + pickup.ExtendedInfo[i].FieldId).val();\n            }\n\n            jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup.Information.Name + \" \" + pickup.Information.Address + \" \" + extra);\n\n            this.platform.setPickupPoint(pickup);\n            this.hideMap();\n        }\n\n        /** \n         *  Returns the distance between 2 (lat,lng) points in kms \n         */\n\n    }, {\n        key: 'getDistance',\n        value: function getDistance(latlng, latlng2) {\n\n            var R = 6371e3; // metres\n            var φ1 = latlng.lat().toRadians();\n            var φ2 = latlng2.lng().toRadians();\n\n            var Δφ = (latln2.lat() - latlng.lng()).toRadians();\n            var Δλ = (latln2.lng() - latlng.lon()).toRadians();\n\n            var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n            var d = Math.floor(R * c / 1000);\n        }\n\n        /** \n         * Show the map and query the server for pickup locations near the shipping address provided by the client\n         * center the map on the first point \n         * remove old markers \n         * add the new markers  \n         */\n\n    }, {\n        key: 'getPickupLocations',\n        value: function getPickupLocations(evt) {\n            var _this = this;\n\n            if (!this.map || !this.map.isScriptLoaded) {\n                console.log(\"map is not loaded ...\");\n                return;\n            }\n\n            this.pickupPointsLoadStart();\n\n            /** because some version of woo will trigger a call to checkout and finish  the order **/\n            evt.preventDefault();\n            evt.stopPropagation();\n\n            this.showMap();\n\n            var data = this.platform.getShippingData();\n            data.action = 'shiptimize_pickup_locations';\n\n            this.map.setCarrierIcon(data.CarrierId);\n\n            this.map.geocode(data, function (geocode) {\n                _this.getPickupLocationsFromGeocodedAddr(geocode, data);\n            });\n        }\n    }, {\n        key: 'getPickupLocationsFromGeocodedAddr',\n        value: function getPickupLocationsFromGeocodedAddr(geocode, data) {\n            var _this2 = this;\n\n            this.resetUI();\n\n            if (!geocode.lng || !geocode.lat) {\n                this.pickupPointsLoadStop();\n                this.pickupError(shiptimize_geolocationfailed);\n                return;\n            }\n\n            data.Address.Country = geocode.iso2;\n            data.Address.Long = geocode.lng;\n            data.Address.Lat = geocode.lat;\n\n            console.log(data);\n            console.log(geocode);\n\n            jQuery.getJSON(this.ajax_url, data, function (pickupPoints) {\n                // We have the points remove the loader \n                _this2.pickupPointsLoadStop();\n\n                if (pickupPoints.length == 0) {\n                    console.log(\"no pickup points found for this address \");\n                    return;\n                }\n\n                console.log(pickupPoints);\n                if (pickupPoints.Error.Id == 0 && pickupPoints.Point.length > 0) {\n                    jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").show();\n                    _this2.setPickupLocations(pickupPoints.Point);\n                } else {\n                    console.log(\"The api returned an error: \", pickupPoints.Error); //pickupPoints.Error.Info || \n                    _this2.pickupError(shiptimize_no_points_found);\n                }\n            }).fail(function (resp) {\n                console.log(\"Error getting points, shiptimize api error? report to shiptimize. \", resp.responseText); //pickupPoints.Error.Info || \n                _this2.pickupError(shiptimize_no_points_found);\n            });\n        }\n    }, {\n        key: 'resetUI',\n        value: function resetUI() {\n            jQuery(\".shiptimize-pickup__error\").hide();\n            this.map.clearMarkers();\n        }\n\n        /** \n         * @param string info - the message to display \n         */\n\n    }, {\n        key: 'pickupError',\n        value: function pickupError(info) {\n            this.pickupPoints = [];\n\n            var eError = jQuery(\".shiptimize-pickup__error\");\n            eError.html(info);\n            eError.show();\n\n            jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").hide();\n        }\n\n        /** \n         * Append the pickup Locations to the map\n         * @param array pickupPoints - an array of available pickup points \n         */\n\n    }, {\n        key: 'setPickupLocations',\n        value: function setPickupLocations(pickupPoints) {\n            var _this3 = this;\n\n            jQuery(\".shiptimize-pickup__error\").hide();\n\n            this.pickupPoints = pickupPoints;\n            this.map.clearMarkers();\n            this.map.centerMap(this.pickupPoints[0].Lat, this.pickupPoints[1].Long);\n            this.map.addMarkers(pickupPoints, function (idx) {\n                _this3.selectPointFromListInMap(idx);\n            });\n            this.setOptionsForAddress(pickupPoints);\n\n            typeof this.map.map.invalidateSize != 'undefined' && this.map.map.invalidateSize();\n\n            setTimeout(function () {\n                _this3.map.fitBounds();\n            }, 200);\n        }\n\n        /** \n         * @param pickupPoints[] - [] of pickup points returned by the api \n         */\n\n    }, {\n        key: 'setOptionsForAddress',\n        value: function setOptionsForAddress(pickupPoints) {\n\n            var html = '';\n            for (var i = 0; i < pickupPoints.length; ++i) {\n                html += '<div class=\"shiptimize-pickup__point\">' + '<input type=\"radio\" value=\"' + i + '\" name=\"shiptimize__point\"  onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\"/>' + '<span class=\"shiptimize-pickup__point_description\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\">' + '<span>' + (pickupPoints[i].Information.Name ? pickupPoints[i].Information.Name + '<br/>' : '') + pickupPoints[i].Information.Address + '</span>' + this.getExtendedInfoHtml(pickupPoints[i]) + '</span>' + '</div>';\n            }\n            console.log(html);\n\n            jQuery(\".shiptimize-pickup__other\").html(html);\n        }\n    }, {\n        key: 'loadMap',\n        value: function loadMap() {\n            this.map.loadMap();\n        }\n    }, {\n        key: 'pickupPointsLoadStart',\n        value: function pickupPointsLoadStart() {\n            jQuery(\".shiptimize-pickup__mapWrapper\").addClass('loading');\n        }\n    }, {\n        key: 'pickupPointsLoadStop',\n        value: function pickupPointsLoadStop() {\n            jQuery(\".shiptimize-pickup__mapWrapper\").removeClass('loading');\n        }\n    }]);\n\n    return Shiptimize;\n}();\n\njQuery(function () {\n    if (typeof woocommerce_params != 'undefined') {\n        window.shiptimize = new Shiptimize(woocommerce_params.ajax_url);\n    }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdG1pemUuanM/NjljNyJdLCJuYW1lcyI6WyJTaGlwdGltaXplIiwiYWpheF91cmwiLCJtYXJrZXJzIiwiaXNNYXBMb2FkZWQiLCJnbWFwc19rZXkiLCJzaGlwdGltaXplX21hcHNfa2V5Iiwib3Blbk1hcE1hcmtlckljb25zIiwicGxhdGZvcm0iLCJXb29Db21tZXJjZSIsIm1hcCIsIkdvb2dsZU1hcCIsIk9wZW5TdHJlZXRNYXAiLCJpc0NoZWNrb3V0IiwiZ3JhbnRSZWFkeSIsInVzZXJTY3JvbGwiLCJqUXVlcnkiLCJzY3JvbGxUb3AiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGlkZSIsImNsZWFyTWFya2VycyIsInBpY2t1cFBvaW50IiwiRXh0ZW5kZWRJbmZvIiwibGVuZ3RoIiwiaHRtbCIsIngiLCJleHRyYUluZm8iLCJUZWtzdCIsIlBvaW50SWQiLCJGaWVsZElkIiwiaWR4IiwicHJvcCIsInNlbGVjdE1hcmtlckJ5SWR4IiwiZ2V0IiwidmFsIiwicGlja3VwIiwicGlja3VwUG9pbnRzIiwiZXh0cmEiLCJpIiwic2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwic2V0UGlja3VwUG9pbnQiLCJoaWRlTWFwIiwibGF0bG5nIiwibGF0bG5nMiIsIlIiLCLPhjEiLCJsYXQiLCJ0b1JhZGlhbnMiLCLPhjIiLCJsbmciLCLOlM+GIiwibGF0bG4yIiwizpTOuyIsImxvbiIsImEiLCJNYXRoIiwic2luIiwiY29zIiwiYyIsImF0YW4yIiwic3FydCIsImQiLCJmbG9vciIsImV2dCIsImlzU2NyaXB0TG9hZGVkIiwiY29uc29sZSIsImxvZyIsInBpY2t1cFBvaW50c0xvYWRTdGFydCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwic2hvd01hcCIsImRhdGEiLCJnZXRTaGlwcGluZ0RhdGEiLCJhY3Rpb24iLCJzZXRDYXJyaWVySWNvbiIsIkNhcnJpZXJJZCIsImdlb2NvZGUiLCJnZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyIiwicmVzZXRVSSIsInBpY2t1cFBvaW50c0xvYWRTdG9wIiwicGlja3VwRXJyb3IiLCJzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkIiwiQ291bnRyeSIsImlzbzIiLCJMb25nIiwiTGF0IiwiZ2V0SlNPTiIsIkVycm9yIiwiSWQiLCJQb2ludCIsInNob3ciLCJzZXRQaWNrdXBMb2NhdGlvbnMiLCJzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCIsImZhaWwiLCJyZXNwIiwicmVzcG9uc2VUZXh0IiwiaW5mbyIsImVFcnJvciIsImNlbnRlck1hcCIsImFkZE1hcmtlcnMiLCJzZWxlY3RQb2ludEZyb21MaXN0SW5NYXAiLCJzZXRPcHRpb25zRm9yQWRkcmVzcyIsImludmFsaWRhdGVTaXplIiwic2V0VGltZW91dCIsImZpdEJvdW5kcyIsImdldEV4dGVuZGVkSW5mb0h0bWwiLCJsb2FkTWFwIiwid29vY29tbWVyY2VfcGFyYW1zIiwid2luZG93Iiwic2hpcHRpbWl6ZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7OztBQUVBOzs7Ozs7SUFNTUEsVTtBQUVGLHdCQUFZQyxRQUFaLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUtDLE9BQUwsR0FBZSxFQUFmLENBRGtCLENBQ0M7QUFDbkIsYUFBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLGFBQUtDLFNBQUwsR0FBaUIsT0FBT0MsbUJBQVAsSUFBK0IsV0FBL0IsR0FBOEMsRUFBOUMsR0FBbURBLG1CQUFwRTtBQUNBLGFBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0EsYUFBS0wsUUFBTCxHQUFnQkEsUUFBaEIsQ0FMa0IsQ0FLUTs7QUFFMUIsYUFBS00sUUFBTCxHQUFnQixJQUFJQywrQkFBSixDQUFnQixLQUFLUCxRQUFyQixDQUFoQjs7QUFFQSxhQUFLUSxHQUFMLEdBQVcsS0FBS0wsU0FBTCxHQUFpQixJQUFJTSx5QkFBSixDQUFjLEtBQUtOLFNBQW5CLENBQWpCLEdBQWlELElBQUlPLDJCQUFKLEVBQTVEO0FBQ0EsYUFBS0osUUFBTCxDQUFjSyxVQUFkO0FBQ0EsYUFBS0gsR0FBTCxDQUFTSSxVQUFUO0FBQ0g7O0FBRUQ7Ozs7Ozs7a0NBR1U7QUFDTixpQkFBS0MsVUFBTCxHQUFrQkMsT0FBTyxXQUFQLEVBQW9CQyxTQUFwQixFQUFsQjtBQUNBRCxtQkFBTyxXQUFQLEVBQW9CQyxTQUFwQixDQUE4QixDQUE5QjtBQUNBRCxtQkFBTyxvQkFBUCxFQUE2QkUsUUFBN0IsQ0FBc0MsUUFBdEM7QUFDSDs7QUFFRDs7Ozs7O2tDQUdVO0FBQ05GLG1CQUFPLG9CQUFQLEVBQTZCRyxXQUE3QixDQUF5QyxRQUF6QztBQUNBSCxtQkFBTywyQkFBUCxFQUFvQ0ksSUFBcEM7QUFDQUosbUJBQU8sV0FBUCxFQUFvQkMsU0FBcEIsQ0FBOEIsS0FBS0YsVUFBbkM7QUFDSDs7O3VDQUVjO0FBQ1gsaUJBQUtMLEdBQUwsQ0FBU1csWUFBVDtBQUNIOztBQUVEOzs7Ozs7OzRDQUlvQkMsVyxFQUFhO0FBQzdCLGdCQUFJLENBQUNBLFlBQVlDLFlBQWIsSUFBNkIsT0FBT0QsWUFBWUMsWUFBWixDQUF5QkMsTUFBaEMsSUFBMEMsV0FBM0UsRUFBd0Y7QUFDcEYsdUJBQU8sRUFBUDtBQUNIOztBQUVELGdCQUFJQyxPQUFPLEVBQVg7O0FBRUEsaUJBQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCSixZQUFZQyxZQUFaLElBQTRCRyxJQUFJSixZQUFZQyxZQUFaLENBQXlCQyxNQUF6RSxFQUFpRixFQUFFRSxDQUFuRixFQUFzRjtBQUNsRixvQkFBSUMsWUFBWUwsWUFBWUMsWUFBWixDQUF5QkcsQ0FBekIsQ0FBaEI7QUFDQUQsd0JBQVEsOENBQ0osb0RBREksR0FDbURFLFVBQVVDLEtBRDdELEdBQ3FFLFVBRHJFLEdBRUosMkZBRkksR0FFMEZOLFlBQVlPLE9BRnRHLEdBRWdILEdBRmhILEdBRXNIRixVQUFVRyxPQUZoSSxHQUUwSSxNQUYxSSxHQUdKLDBGQUhJLEdBR3lGSCxVQUFVRyxPQUhuRyxHQUc2RyxNQUg3RyxHQUlKLFFBSko7QUFLSDs7QUFFRCxtQkFBT0wsSUFBUDtBQUNIOztBQUVEOzs7Ozs7O2lEQUl5Qk0sRyxFQUFLO0FBQzFCZixtQkFBTyxpQ0FBUCxFQUEwQ2dCLElBQTFDLENBQStDLFNBQS9DLEVBQTBELEtBQTFEO0FBQ0EsaUJBQUt0QixHQUFMLENBQVN1QixpQkFBVCxDQUEyQkYsR0FBM0I7O0FBRUFmLG1CQUFPQSxPQUFPLGlDQUFQLEVBQTBDa0IsR0FBMUMsQ0FBOENILEdBQTlDLENBQVAsRUFBMkRDLElBQTNELENBQWdFLFNBQWhFLEVBQTJFLElBQTNFO0FBQ0g7O0FBRUQ7Ozs7Ozt5Q0FHaUI7QUFDYixnQkFBSUQsTUFBTWYsT0FBTyx5Q0FBUCxFQUFrRG1CLEdBQWxELEVBQVY7QUFDQSxnQkFBSUMsU0FBUyxLQUFLQyxZQUFMLENBQWtCTixHQUFsQixDQUFiO0FBQ0EsZ0JBQUlPLFFBQVEsRUFBWjs7QUFFQSxpQkFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JILE9BQU9iLFlBQVAsSUFBdUJnQixJQUFJSCxPQUFPYixZQUFQLENBQW9CQyxNQUEvRCxFQUF1RSxFQUFFZSxDQUF6RSxFQUE0RTtBQUN4RUQseUJBQVMsVUFBVUYsT0FBT2IsWUFBUCxDQUFvQmdCLENBQXBCLEVBQXVCWCxLQUFqQyxHQUF5QyxJQUF6QyxHQUFnRFosT0FBTyx1QkFBdUJvQixPQUFPUCxPQUE5QixHQUF3QyxHQUF4QyxHQUE4Q08sT0FBT2IsWUFBUCxDQUFvQmdCLENBQXBCLEVBQXVCVCxPQUE1RSxFQUFxRkssR0FBckYsRUFBekQ7QUFDSDs7QUFFRG5CLG1CQUFPLGlDQUFQLEVBQTBDUyxJQUExQyxDQUErQ2UsNkJBQTZCLEtBQTdCLEdBQXFDSixPQUFPSyxXQUFQLENBQW1CQyxJQUF4RCxHQUErRCxHQUEvRCxHQUFxRU4sT0FBT0ssV0FBUCxDQUFtQkUsT0FBeEYsR0FBa0csR0FBbEcsR0FBd0dMLEtBQXZKOztBQUVBLGlCQUFLOUIsUUFBTCxDQUFjb0MsY0FBZCxDQUE2QlIsTUFBN0I7QUFDQSxpQkFBS1MsT0FBTDtBQUNIOztBQUdEOzs7Ozs7b0NBR1lDLE0sRUFBUUMsTyxFQUFTOztBQUV6QixnQkFBSUMsSUFBSSxNQUFSLENBRnlCLENBRVQ7QUFDaEIsZ0JBQUlDLEtBQUtILE9BQU9JLEdBQVAsR0FBYUMsU0FBYixFQUFUO0FBQ0EsZ0JBQUlDLEtBQUtMLFFBQVFNLEdBQVIsR0FBY0YsU0FBZCxFQUFUOztBQUVBLGdCQUFJRyxLQUFLLENBQUNDLE9BQU9MLEdBQVAsS0FBZUosT0FBT08sR0FBUCxFQUFoQixFQUE4QkYsU0FBOUIsRUFBVDtBQUNBLGdCQUFJSyxLQUFLLENBQUNELE9BQU9GLEdBQVAsS0FBZVAsT0FBT1csR0FBUCxFQUFoQixFQUE4Qk4sU0FBOUIsRUFBVDs7QUFFQSxnQkFBSU8sSUFBSUMsS0FBS0MsR0FBTCxDQUFTTixLQUFLLENBQWQsSUFBbUJLLEtBQUtDLEdBQUwsQ0FBU04sS0FBSyxDQUFkLENBQW5CLEdBQ0pLLEtBQUtFLEdBQUwsQ0FBU1osRUFBVCxJQUFlVSxLQUFLRSxHQUFMLENBQVNULEVBQVQsQ0FBZixHQUNBTyxLQUFLQyxHQUFMLENBQVNKLEtBQUssQ0FBZCxDQURBLEdBQ21CRyxLQUFLQyxHQUFMLENBQVNKLEtBQUssQ0FBZCxDQUZ2QjtBQUdBLGdCQUFJTSxJQUFJLElBQUlILEtBQUtJLEtBQUwsQ0FBV0osS0FBS0ssSUFBTCxDQUFVTixDQUFWLENBQVgsRUFBeUJDLEtBQUtLLElBQUwsQ0FBVSxJQUFJTixDQUFkLENBQXpCLENBQVo7O0FBRUEsZ0JBQUlPLElBQUlOLEtBQUtPLEtBQUwsQ0FBV2xCLElBQUljLENBQUosR0FBUSxJQUFuQixDQUFSO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzsyQ0FNbUJLLEcsRUFBSztBQUFBOztBQUNwQixnQkFBRyxDQUFDLEtBQUt6RCxHQUFOLElBQWEsQ0FBQyxLQUFLQSxHQUFMLENBQVMwRCxjQUExQixFQUF5QztBQUNyQ0Msd0JBQVFDLEdBQVIsQ0FBWSx1QkFBWjtBQUNBO0FBQ0g7O0FBRUQsaUJBQUtDLHFCQUFMOztBQUVBO0FBQ0FKLGdCQUFJSyxjQUFKO0FBQ0FMLGdCQUFJTSxlQUFKOztBQUVBLGlCQUFLQyxPQUFMOztBQUVBLGdCQUFJQyxPQUFPLEtBQUtuRSxRQUFMLENBQWNvRSxlQUFkLEVBQVg7QUFDQUQsaUJBQUtFLE1BQUwsR0FBYyw2QkFBZDs7QUFFQSxpQkFBS25FLEdBQUwsQ0FBU29FLGNBQVQsQ0FBd0JILEtBQUtJLFNBQTdCOztBQUVBLGlCQUFLckUsR0FBTCxDQUFTc0UsT0FBVCxDQUFpQkwsSUFBakIsRUFBdUIsVUFBQ0ssT0FBRCxFQUFhO0FBQUUsc0JBQUtDLGtDQUFMLENBQXdDRCxPQUF4QyxFQUFpREwsSUFBakQ7QUFBeUQsYUFBL0Y7QUFDSDs7OzJEQUdrQ0ssTyxFQUFTTCxJLEVBQU07QUFBQTs7QUFDOUMsaUJBQUtPLE9BQUw7O0FBRUEsZ0JBQUcsQ0FBQ0YsUUFBUTNCLEdBQVQsSUFBZ0IsQ0FBQzJCLFFBQVE5QixHQUE1QixFQUFpQztBQUM3QixxQkFBS2lDLG9CQUFMO0FBQ0EscUJBQUtDLFdBQUwsQ0FBaUJDLDRCQUFqQjtBQUNBO0FBQ0g7O0FBRURWLGlCQUFLaEMsT0FBTCxDQUFhMkMsT0FBYixHQUF1Qk4sUUFBUU8sSUFBL0I7QUFDQVosaUJBQUtoQyxPQUFMLENBQWE2QyxJQUFiLEdBQW9CUixRQUFRM0IsR0FBNUI7QUFDQXNCLGlCQUFLaEMsT0FBTCxDQUFhOEMsR0FBYixHQUFtQlQsUUFBUTlCLEdBQTNCOztBQUVBbUIsb0JBQVFDLEdBQVIsQ0FBWUssSUFBWjtBQUNBTixvQkFBUUMsR0FBUixDQUFZVSxPQUFaOztBQUVBaEUsbUJBQU8wRSxPQUFQLENBQWUsS0FBS3hGLFFBQXBCLEVBQThCeUUsSUFBOUIsRUFBb0MsVUFBQ3RDLFlBQUQsRUFBa0I7QUFDbEQ7QUFDQSx1QkFBSzhDLG9CQUFMOztBQUVBLG9CQUFJOUMsYUFBYWIsTUFBYixJQUF1QixDQUEzQixFQUE4QjtBQUMxQjZDLDRCQUFRQyxHQUFSLENBQVksMENBQVo7QUFDQTtBQUNIOztBQUVERCx3QkFBUUMsR0FBUixDQUFZakMsWUFBWjtBQUNBLG9CQUFJQSxhQUFhc0QsS0FBYixDQUFtQkMsRUFBbkIsSUFBeUIsQ0FBekIsSUFBOEJ2RCxhQUFhd0QsS0FBYixDQUFtQnJFLE1BQW5CLEdBQTRCLENBQTlELEVBQWtFO0FBQzlEUiwyQkFBTyxxREFBUCxFQUE4RDhFLElBQTlEO0FBQ0EsMkJBQUtDLGtCQUFMLENBQXdCMUQsYUFBYXdELEtBQXJDO0FBQ0gsaUJBSEQsTUFHTztBQUNIeEIsNEJBQVFDLEdBQVIsQ0FBWSw2QkFBWixFQUEyQ2pDLGFBQWFzRCxLQUF4RCxFQURHLENBQzZEO0FBQ2hFLDJCQUFLUCxXQUFMLENBQWlCWSwwQkFBakI7QUFDSDtBQUVKLGFBbEJELEVBa0JHQyxJQWxCSCxDQWtCUyxVQUFDQyxJQUFELEVBQVU7QUFDZjdCLHdCQUFRQyxHQUFSLENBQVksb0VBQVosRUFBa0Y0QixLQUFLQyxZQUF2RixFQURlLENBQ3VGO0FBQ3RHLHVCQUFLZixXQUFMLENBQWlCWSwwQkFBakI7QUFDSCxhQXJCRDtBQXNCSDs7O2tDQUVRO0FBQ0xoRixtQkFBTywyQkFBUCxFQUFvQ0ksSUFBcEM7QUFDQSxpQkFBS1YsR0FBTCxDQUFTVyxZQUFUO0FBQ0g7O0FBRUQ7Ozs7OztvQ0FHWStFLEksRUFBTTtBQUNkLGlCQUFLL0QsWUFBTCxHQUFvQixFQUFwQjs7QUFFQSxnQkFBSWdFLFNBQVNyRixPQUFPLDJCQUFQLENBQWI7QUFDQXFGLG1CQUFPNUUsSUFBUCxDQUFZMkUsSUFBWjtBQUNBQyxtQkFBT1AsSUFBUDs7QUFFQTlFLG1CQUFPLHFEQUFQLEVBQThESSxJQUE5RDtBQUNIOztBQUVEOzs7Ozs7OzJDQUltQmlCLFksRUFBYztBQUFBOztBQUM3QnJCLG1CQUFPLDJCQUFQLEVBQW9DSSxJQUFwQzs7QUFFQSxpQkFBS2lCLFlBQUwsR0FBb0JBLFlBQXBCO0FBQ0EsaUJBQUszQixHQUFMLENBQVNXLFlBQVQ7QUFDQSxpQkFBS1gsR0FBTCxDQUFTNEYsU0FBVCxDQUFtQixLQUFLakUsWUFBTCxDQUFrQixDQUFsQixFQUFxQm9ELEdBQXhDLEVBQTZDLEtBQUtwRCxZQUFMLENBQWtCLENBQWxCLEVBQXFCbUQsSUFBbEU7QUFDQSxpQkFBSzlFLEdBQUwsQ0FBUzZGLFVBQVQsQ0FBb0JsRSxZQUFwQixFQUFrQyxVQUFDTixHQUFELEVBQVM7QUFBRSx1QkFBS3lFLHdCQUFMLENBQThCekUsR0FBOUI7QUFBcUMsYUFBbEY7QUFDQSxpQkFBSzBFLG9CQUFMLENBQTBCcEUsWUFBMUI7O0FBRUMsbUJBQU8sS0FBSzNCLEdBQUwsQ0FBU0EsR0FBVCxDQUFhZ0csY0FBcEIsSUFBdUMsV0FBeEMsSUFBd0QsS0FBS2hHLEdBQUwsQ0FBU0EsR0FBVCxDQUFhZ0csY0FBYixFQUF4RDs7QUFFQUMsdUJBQWEsWUFBTTtBQUNmLHVCQUFLakcsR0FBTCxDQUFTa0csU0FBVDtBQUNILGFBRkQsRUFFRyxHQUZIO0FBR0g7O0FBRUQ7Ozs7Ozs2Q0FHcUJ2RSxZLEVBQWM7O0FBRS9CLGdCQUFJWixPQUFPLEVBQVg7QUFDQSxpQkFBSyxJQUFJYyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLGFBQWFiLE1BQWpDLEVBQXlDLEVBQUVlLENBQTNDLEVBQThDO0FBQzFDZCx3QkFBUSwyQ0FDSiw2QkFESSxHQUM0QmMsQ0FENUIsR0FDZ0MsMkVBRGhDLEdBQzhHQSxDQUQ5RyxHQUNrSCxNQURsSCxHQUVKLGtHQUZJLEdBRWlHQSxDQUZqRyxHQUVxRyxLQUZyRyxHQUdKLFFBSEksSUFHUUYsYUFBYUUsQ0FBYixFQUFnQkUsV0FBaEIsQ0FBNEJDLElBQTVCLEdBQWtDTCxhQUFhRSxDQUFiLEVBQWdCRSxXQUFoQixDQUE0QkMsSUFBNUIsR0FBbUMsT0FBckUsR0FBK0UsRUFIdkYsSUFJREwsYUFBYUUsQ0FBYixFQUFnQkUsV0FBaEIsQ0FBNEJFLE9BSjNCLEdBSXFDLFNBSnJDLEdBS0osS0FBS2tFLG1CQUFMLENBQXlCeEUsYUFBYUUsQ0FBYixDQUF6QixDQUxJLEdBTUosU0FOSSxHQVNKLFFBVEo7QUFVSDtBQUNEOEIsb0JBQVFDLEdBQVIsQ0FBWTdDLElBQVo7O0FBRUFULG1CQUFPLDJCQUFQLEVBQW9DUyxJQUFwQyxDQUF5Q0EsSUFBekM7QUFDSDs7O2tDQUdTO0FBQ04saUJBQUtmLEdBQUwsQ0FBU29HLE9BQVQ7QUFDSDs7O2dEQUV1QjtBQUN0QjlGLG1CQUFPLGdDQUFQLEVBQXlDRSxRQUF6QyxDQUFrRCxTQUFsRDtBQUNEOzs7K0NBRXNCO0FBQ3JCRixtQkFBTyxnQ0FBUCxFQUF5Q0csV0FBekMsQ0FBcUQsU0FBckQ7QUFDRDs7Ozs7O0FBR0xILE9BQU8sWUFBVztBQUNkLFFBQUcsT0FBTytGLGtCQUFQLElBQThCLFdBQWpDLEVBQTZDO0FBQ3pDQyxlQUFPQyxVQUFQLEdBQW9CLElBQUloSCxVQUFKLENBQWU4RyxtQkFBbUI3RyxRQUFsQyxDQUFwQjtBQUNIO0FBQ0osQ0FKRCIsImZpbGUiOiIuL3NoaXB0bWl6ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9zY3NzL3NoaXB0aW1pemUuc2Nzcyc7XG5pbXBvcnQgJy4vY3NzL2xlYWZsZXQuY3NzJztcblxuaW1wb3J0IFV0aWxzIGZyb20gJy4vanMvc2hpcHRpbWl6ZS11dGlscy5qcyc7XG5pbXBvcnQgV29vQ29tbWVyY2UgZnJvbSAnLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcyc7XG5cbmltcG9ydCBHb29nbGVNYXAgZnJvbSAnLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzJztcbmltcG9ydCBPcGVuU3RyZWV0TWFwIGZyb20gJy4vanMvc2hpcHRpbWl6ZS1vcGVuLW1hcC5qcyc7XG5cbi8qKiBcbiAqIENsYXNzIFNoaXB0aW1pemUgZGVwZW5kcyBvbiBqUXVlcnkuIFxuICogQ2hlY2sgaWYgd2UgYXJlIG1lYW50IHRvIGFwcGVuZCBhIG1hcCBcbiAqIFxuICogUGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCAgICogQHBsYXRmb3JtRGVwZW5kZW50IFxuICovXG5jbGFzcyBTaGlwdGltaXplIHtcblxuICAgIGNvbnN0cnVjdG9yKGFqYXhfdXJsKSB7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdOyAvL3BpY2t1cCB7bGF0LCBsbmd9IFxuICAgICAgICB0aGlzLmlzTWFwTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ21hcHNfa2V5ID0gdHlwZW9mKHNoaXB0aW1pemVfbWFwc19rZXkpID09ICd1bmRlZmluZWQnID8gICcnIDogc2hpcHRpbWl6ZV9tYXBzX2tleSA7XG4gICAgICAgIHRoaXMub3Blbk1hcE1hcmtlckljb25zID0ge307XG4gICAgICAgIHRoaXMuYWpheF91cmwgPSBhamF4X3VybDsgLy8gcGxhdGZvcm0gZGVwZW5kZW50IFxuXG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgV29vQ29tbWVyY2UodGhpcy5hamF4X3VybCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSB0aGlzLmdtYXBzX2tleSA/IG5ldyBHb29nbGVNYXAodGhpcy5nbWFwc19rZXkpIDogbmV3IE9wZW5TdHJlZXRNYXAoKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybS5pc0NoZWNrb3V0KCk7IFxuICAgICAgICB0aGlzLm1hcC5ncmFudFJlYWR5KCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgdGhlIG1hcCB0byB0aGUgdXNlciBcbiAgICAgKi9cbiAgICBzaG93TWFwKCkge1xuICAgICAgICB0aGlzLnVzZXJTY3JvbGwgPSBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCgpOyBcbiAgICAgICAgalF1ZXJ5KCdodG1sLGJvZHknKS5zY3JvbGxUb3AoMCk7IFxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBcIikuYWRkQ2xhc3MoXCJhY3RpdmVcIik7IFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBIaWRlIHRoZSBtYXAgICBcbiAgICAgKi9cbiAgICBoaWRlTWFwKCkge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuICAgICAgICBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCh0aGlzLnVzZXJTY3JvbGwpOyBcbiAgICB9XG5cbiAgICBjbGVhck1hcmtlcnMoKSB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyTWFya2VycygpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBHZW5lcmF0ZSB0aGUgaW5wdXRzIGZvciB0aGUgdXNlciB0byBhcHBlbmQgZXh0cmEgaW5mbyBpZiBuZWNlc3NhcnkgXG4gICAgICogVGhlIGlkIG9mIHRoZXNlIGZpZWxkcyBpcyBpbiB0aGUgZm9ybWF0IHNoaXB0aW1pemVfZXh0cmFfe1BvaW50SWR9X3tGaWVsZElkfVxuICAgICAqL1xuICAgIGdldEV4dGVuZGVkSW5mb0h0bWwocGlja3VwUG9pbnQpIHtcbiAgICAgICAgaWYgKCFwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8gfHwgdHlwZW9mKHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mby5sZW5ndGgpID09J3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGh0bWwgPSAnJztcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgcGlja3VwUG9pbnQuRXh0ZW5kZWRJbmZvICYmIHggPCBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8ubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIGxldCBleHRyYUluZm8gPSBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm9beF07XG4gICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX2V4dGVuZGVkXCI+JyArXG4gICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNoaXB0aW1pemUtcGlja3VwX19leHRlbmRlZF9sYWJlbCBcIj4nICsgZXh0cmFJbmZvLlRla3N0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzaGlwdGltaXplX3BpY2t1cF9leHRlbmRlZF92YWx1ZVwiIHZhbHVlPVwiXCIgaWQ9XCJzaGlwdGltaXplX2V4dHJhXycgKyBwaWNrdXBQb2ludC5Qb2ludElkICsgJ18nICsgZXh0cmFJbmZvLkZpZWxkSWQgKyAnXCIvPiAnICtcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic2hpcHRpbWl6ZV9waWNrdXBfZXh0ZW5kZWRfaWRcIiBpZD1cInNoaXB0aW1pemVfcGlja3VwXCIgdmFsdWU9XCInICsgZXh0cmFJbmZvLkZpZWxkSWQgKyAnXCIvPiAnICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGFsbCBtYXJrZXJzICBcbiAgICAgKiBTZWxlY3QgdGhlIG1hcmtlciBvZiBpbmRleCBpZHggaW4gbWFwIFxuICAgICAqL1xuICAgIHNlbGVjdFBvaW50RnJvbUxpc3RJbk1hcChpZHgpIHtcbiAgICAgICAgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9fcG9pbnQnXVwiKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICB0aGlzLm1hcC5zZWxlY3RNYXJrZXJCeUlkeChpZHgpO1xuXG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddXCIpLmdldChpZHgpKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB2YWxpZGF0ZSBidXR0b24gXG4gICAgICovXG4gICAgc2VsZWN0RnJvbUxpc3QoKSB7XG4gICAgICAgIGxldCBpZHggPSBqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddOmNoZWNrZWRcIikudmFsKCk7XG4gICAgICAgIGxldCBwaWNrdXAgPSB0aGlzLnBpY2t1cFBvaW50c1tpZHhdO1xuICAgICAgICBsZXQgZXh0cmEgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGlja3VwLkV4dGVuZGVkSW5mbyAmJiBpIDwgcGlja3VwLkV4dGVuZGVkSW5mby5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZXh0cmEgKz0gXCI8YnIvPlwiICsgcGlja3VwLkV4dGVuZGVkSW5mb1tpXS5UZWtzdCArICc6ICcgKyBqUXVlcnkoXCIjc2hpcHRpbWl6ZV9leHRyYV9cIiArIHBpY2t1cC5Qb2ludElkICsgXCJfXCIgKyBwaWNrdXAuRXh0ZW5kZWRJbmZvW2ldLkZpZWxkSWQpLnZhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19kZXNjcmlwdGlvblwiKS5odG1sKHNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwICsgXCIgOiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5OYW1lICsgXCIgXCIgKyBwaWNrdXAuSW5mb3JtYXRpb24uQWRkcmVzcyArIFwiIFwiICsgZXh0cmEpO1xuXG4gICAgICAgIHRoaXMucGxhdGZvcm0uc2V0UGlja3VwUG9pbnQocGlja3VwKTtcbiAgICAgICAgdGhpcy5oaWRlTWFwKCk7XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogIFJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gMiAobGF0LGxuZykgcG9pbnRzIGluIGttcyBcbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZShsYXRsbmcsIGxhdGxuZzIpIHtcblxuICAgICAgICB2YXIgUiA9IDYzNzFlMzsgLy8gbWV0cmVzXG4gICAgICAgIHZhciDPhjEgPSBsYXRsbmcubGF0KCkudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDPhjIgPSBsYXRsbmcyLmxuZygpLnRvUmFkaWFucygpO1xuXG4gICAgICAgIHZhciDOlM+GID0gKGxhdGxuMi5sYXQoKSAtIGxhdGxuZy5sbmcoKSkudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDOlM67ID0gKGxhdGxuMi5sbmcoKSAtIGxhdGxuZy5sb24oKSkudG9SYWRpYW5zKCk7XG5cbiAgICAgICAgdmFyIGEgPSBNYXRoLnNpbijOlM+GIC8gMikgKiBNYXRoLnNpbijOlM+GIC8gMikgK1xuICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguY29zKM+GMikgKlxuICAgICAgICAgICAgTWF0aC5zaW4ozpTOuyAvIDIpICogTWF0aC5zaW4ozpTOuyAvIDIpO1xuICAgICAgICB2YXIgYyA9IDIgKiBNYXRoLmF0YW4yKE1hdGguc3FydChhKSwgTWF0aC5zcXJ0KDEgLSBhKSk7XG5cbiAgICAgICAgdmFyIGQgPSBNYXRoLmZsb29yKFIgKiBjIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgdGhlIG1hcCBhbmQgcXVlcnkgdGhlIHNlcnZlciBmb3IgcGlja3VwIGxvY2F0aW9ucyBuZWFyIHRoZSBzaGlwcGluZyBhZGRyZXNzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnRcbiAgICAgKiBjZW50ZXIgdGhlIG1hcCBvbiB0aGUgZmlyc3QgcG9pbnQgXG4gICAgICogcmVtb3ZlIG9sZCBtYXJrZXJzIFxuICAgICAqIGFkZCB0aGUgbmV3IG1hcmtlcnMgIFxuICAgICAqL1xuICAgIGdldFBpY2t1cExvY2F0aW9ucyhldnQpIHtcbiAgICAgICAgaWYoIXRoaXMubWFwIHx8ICF0aGlzLm1hcC5pc1NjcmlwdExvYWRlZCl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcCBpcyBub3QgbG9hZGVkIC4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0YXJ0KCk7IFxuXG4gICAgICAgIC8qKiBiZWNhdXNlIHNvbWUgdmVyc2lvbiBvZiB3b28gd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byBjaGVja291dCBhbmQgZmluaXNoICB0aGUgb3JkZXIgKiovXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNob3dNYXAoKTtcblxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMucGxhdGZvcm0uZ2V0U2hpcHBpbmdEYXRhKCk7XG4gICAgICAgIGRhdGEuYWN0aW9uID0gJ3NoaXB0aW1pemVfcGlja3VwX2xvY2F0aW9ucyc7XG5cbiAgICAgICAgdGhpcy5tYXAuc2V0Q2Fycmllckljb24oZGF0YS5DYXJyaWVySWQpO1xuXG4gICAgICAgIHRoaXMubWFwLmdlb2NvZGUoZGF0YSwgKGdlb2NvZGUpID0+IHsgdGhpcy5nZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyKGdlb2NvZGUsIGRhdGEpOyB9KTtcbiAgICB9XG5cblxuICAgIGdldFBpY2t1cExvY2F0aW9uc0Zyb21HZW9jb2RlZEFkZHIoZ2VvY29kZSwgZGF0YSkge1xuICAgICAgICB0aGlzLnJlc2V0VUkoKTsgXG4gICAgICAgIFxuICAgICAgICBpZighZ2VvY29kZS5sbmcgfHwgIWdlb2NvZGUubGF0KSB7XG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c0xvYWRTdG9wKCk7IFxuICAgICAgICAgICAgdGhpcy5waWNrdXBFcnJvcihzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuQWRkcmVzcy5Db3VudHJ5ID0gZ2VvY29kZS5pc28yO1xuICAgICAgICBkYXRhLkFkZHJlc3MuTG9uZyA9IGdlb2NvZGUubG5nO1xuICAgICAgICBkYXRhLkFkZHJlc3MuTGF0ID0gZ2VvY29kZS5sYXQ7XG5cbiAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGdlb2NvZGUpO1xuXG4gICAgICAgIGpRdWVyeS5nZXRKU09OKHRoaXMuYWpheF91cmwsIGRhdGEsIChwaWNrdXBQb2ludHMpID0+IHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHBvaW50cyByZW1vdmUgdGhlIGxvYWRlciBcbiAgICAgICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0b3AoKTsgXG5cbiAgICAgICAgICAgIGlmIChwaWNrdXBQb2ludHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5vIHBpY2t1cCBwb2ludHMgZm91bmQgZm9yIHRoaXMgYWRkcmVzcyBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwaWNrdXBQb2ludHMpO1xuICAgICAgICAgICAgaWYgKHBpY2t1cFBvaW50cy5FcnJvci5JZCA9PSAwICYmIHBpY2t1cFBvaW50cy5Qb2ludC5sZW5ndGggPiAwICkge1xuICAgICAgICAgICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fb3B0aW9ucywuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQaWNrdXBMb2NhdGlvbnMocGlja3VwUG9pbnRzLlBvaW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgYXBpIHJldHVybmVkIGFuIGVycm9yOiBcIiwgcGlja3VwUG9pbnRzLkVycm9yKTsgLy9waWNrdXBQb2ludHMuRXJyb3IuSW5mbyB8fCBcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfbm9fcG9pbnRzX2ZvdW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KS5mYWlsKCAocmVzcCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBnZXR0aW5nIHBvaW50cywgc2hpcHRpbWl6ZSBhcGkgZXJyb3I/IHJlcG9ydCB0byBzaGlwdGltaXplLiBcIiwgcmVzcC5yZXNwb25zZVRleHQpOyAvL3BpY2t1cFBvaW50cy5FcnJvci5JbmZvIHx8IFxuICAgICAgICAgICAgdGhpcy5waWNrdXBFcnJvcihzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCk7IFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldFVJKCl7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuICAgICAgICB0aGlzLm1hcC5jbGVhck1hcmtlcnMoKTsgXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBzdHJpbmcgaW5mbyAtIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgXG4gICAgICovXG4gICAgcGlja3VwRXJyb3IoaW5mbykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IFtdOyBcblxuICAgICAgICBsZXQgZUVycm9yID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKTtcbiAgICAgICAgZUVycm9yLmh0bWwoaW5mbyk7XG4gICAgICAgIGVFcnJvci5zaG93KCk7XG5cbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19vcHRpb25zLC5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQXBwZW5kIHRoZSBwaWNrdXAgTG9jYXRpb25zIHRvIHRoZSBtYXBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgYXZhaWxhYmxlIHBpY2t1cCBwb2ludHMgXG4gICAgICovXG4gICAgc2V0UGlja3VwTG9jYXRpb25zKHBpY2t1cFBvaW50cykge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Vycm9yXCIpLmhpZGUoKTtcblxuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50cztcbiAgICAgICAgdGhpcy5tYXAuY2xlYXJNYXJrZXJzKCk7XG4gICAgICAgIHRoaXMubWFwLmNlbnRlck1hcCh0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzFdLkxvbmcpO1xuICAgICAgICB0aGlzLm1hcC5hZGRNYXJrZXJzKHBpY2t1cFBvaW50cywgKGlkeCkgPT4geyB0aGlzLnNlbGVjdFBvaW50RnJvbUxpc3RJbk1hcChpZHgpOyB9KTtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zRm9yQWRkcmVzcyhwaWNrdXBQb2ludHMpO1xuXG4gICAgICAgICh0eXBlb2YodGhpcy5tYXAubWFwLmludmFsaWRhdGVTaXplKSAhPSAndW5kZWZpbmVkJykgJiYgdGhpcy5tYXAubWFwLmludmFsaWRhdGVTaXplKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCAoICgpID0+IHsgXG4gICAgICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoKTsgXG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBwaWNrdXBQb2ludHNbXSAtIFtdIG9mIHBpY2t1cCBwb2ludHMgcmV0dXJuZWQgYnkgdGhlIGFwaSBcbiAgICAgKi9cbiAgICBzZXRPcHRpb25zRm9yQWRkcmVzcyhwaWNrdXBQb2ludHMpIHtcblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpY2t1cFBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNoaXB0aW1pemUtcGlja3VwX19wb2ludFwiPicgK1xuICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCInICsgaSArICdcIiBuYW1lPVwic2hpcHRpbWl6ZV9fcG9pbnRcIiAgb25jbGljaz1cInNoaXB0aW1pemUuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKCcgKyBpICsgJylcIi8+JyArXG4gICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX3BvaW50X2Rlc2NyaXB0aW9uXCIgb25jbGljaz1cInNoaXB0aW1pemUuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKCcgKyBpICsgJylcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4+JyArIChwaWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uTmFtZSA/cGlja3VwUG9pbnRzW2ldLkluZm9ybWF0aW9uLk5hbWUgKyAnPGJyLz4nIDogJycpXG4gICAgICAgICAgICAgICAgICsgcGlja3VwUG9pbnRzW2ldLkluZm9ybWF0aW9uLkFkZHJlc3MgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RXh0ZW5kZWRJbmZvSHRtbChwaWNrdXBQb2ludHNbaV0pICtcbiAgICAgICAgICAgICAgICAnPC9zcGFuPidcblxuICAgICAgICAgICAgICAgICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhodG1sKTtcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX290aGVyXCIpLmh0bWwoaHRtbCk7XG4gICAgfVxuXG5cbiAgICBsb2FkTWFwKCkge1xuICAgICAgICB0aGlzLm1hcC5sb2FkTWFwKCk7XG4gICAgfVxuXG4gICAgcGlja3VwUG9pbnRzTG9hZFN0YXJ0KCkge1xuICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBXcmFwcGVyXCIpLmFkZENsYXNzKCdsb2FkaW5nJyk7ICBcbiAgICB9OyBcblxuICAgIHBpY2t1cFBvaW50c0xvYWRTdG9wKCkge1xuICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBXcmFwcGVyXCIpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJyk7IFxuICAgIH07XG59XG5cbmpRdWVyeShmdW5jdGlvbigpIHtcbiAgICBpZih0eXBlb2Yod29vY29tbWVyY2VfcGFyYW1zKSAhPSAndW5kZWZpbmVkJyl7XG4gICAgICAgIHdpbmRvdy5zaGlwdGltaXplID0gbmV3IFNoaXB0aW1pemUod29vY29tbWVyY2VfcGFyYW1zLmFqYXhfdXJsKTsgICAgXG4gICAgfSBcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./shiptmize.js\n");
     168
     169/***/ })
     170
     171/******/ });
  • shiptimize-for-woocommerce/trunk/constants.php

    r2726206 r2746465  
    44define( 'SHIPTIMIZE_API_URL', 'https://api.pakketmail.nl/v3' );
    55define( 'SHIPTIMIZE_BRAND', 'Shiptimize' );
    6 define( 'SHIPTIMIZE_VERSION', '3.1.45' );
     6define( 'SHIPTIMIZE_VERSION', '3.1.47' );
    77define( 'SHIPTIMIZE_CREATE_ACCOUNT', 'https://www.shiptimize.me/quote/' );
    88define( 'SHIPTIMIZE_CHECKOUT', 0);
  • shiptimize-for-woocommerce/trunk/includes/admin/class-shiptimize-order-ui.php

    r2722008 r2746465  
    6666    WooShiptimize::log("requesting label status from $callbackurl");
    6767    $response = WooShiptimize::get_api()->monitor_label_status($callbackurl);
    68     if (isset($response->response->Finished) && $response->response->Finished ) {
    69       foreach($response->response->ClientReferenceCodeList as $labelresult) {
    70         $order = new WooShiptimizeOrder($labelresult->ReferenceCode);
    71         $status = ShiptimizeOrder::$LABEL_STATUS_NOT_REQUESTED;
    72         $msg =  '';
    73         $labelurl = '';
    74 
    75         if ($labelresult->Error->Id == 0 ) {
    76           $status = ShiptimizeOrder::$LABEL_STATUS_PRINTED;
    77           $labelurl = $response->response->LabelFile; // all labels in this batch share the same url 
    78           $msg = $shiptimize->translate('labelprinted');
    79         }
    80         else {
    81           $status = ShiptimizeOrder::$LABEL_STATUS_ERROR;
    82           $msg = $labelresult->Error->Info;
    83         }
    84 
    85         $order_meta = $order->get_order_meta();
    86         $msg = $order_meta->message . $msg; 
    87         $labelresult->message = $msg;
    88         $order->set_label_meta($labelresult->ReferenceCode,$status,$labelurl,$msg);
    89       }     
     68    WooShiptimize::log("label_response " . var_export($response, true));
     69    if (isset($response->response->Finished) && $response->response->Finished == 100) {
     70      if (isset($response->response->ClientReferenceCodeList)) {
     71        foreach($response->response->ClientReferenceCodeList as $labelresult) {
     72          $order = new WooShiptimizeOrder($labelresult->ReferenceCode);
     73          $status = ShiptimizeOrder::$LABEL_STATUS_NOT_REQUESTED;
     74          $msg =  '';
     75          $labelurl = '';
     76
     77          if ($labelresult->Error->Id == 0 ) {
     78            $status = ShiptimizeOrder::$LABEL_STATUS_PRINTED;
     79            $labelurl = $response->response->LabelFile; // all labels in this batch share the same url 
     80            $msg = $shiptimize->translate('labelprinted');
     81          }
     82          else {
     83            $status = ShiptimizeOrder::$LABEL_STATUS_ERROR;
     84            $msg = $labelresult->Error->Info;
     85          }
     86
     87          $order_meta = $order->get_order_meta();
     88          $msg = $order_meta->message . $msg; 
     89          $labelresult->message = $msg;
     90          $order->set_label_meta($labelresult->ReferenceCode,$status,$labelurl,$msg);
     91        }   
     92      } 
    9093    }
    9194
     
    324327    $urlString = '';
    325328
    326     if ( WooShiptimize::$is_dev ) {
    327       error_log ( "bulk_export summary " . var_export($summary, true) );
    328     }
    329329   
     330    WooShiptimize::log ( "bulk_export summary " . var_export($summary, true) );
     331       
    330332    if(isset($summary->response)) {
    331333      if(isset($summary->response->CallbackURL)) {
     
    350352    $urlString = '';
    351353
    352     if ( WooShiptimize::$is_dev ) {
    353       error_log ( "bulk_export summary " . var_export($summary, true) );
    354     }
     354   
     355    WooShiptimize::log( "bulk_export summary " . var_export($summary, true) );
     356   
    355357 
    356358    foreach((array)$summary as $key => $value) {
  • shiptimize-for-woocommerce/trunk/includes/admin/class-shiptimize-shipping.php

    r2724326 r2746465  
    2222    $this->filters();
    2323
    24     $this->is_dev = file_exists(ABSPATH.'isdevmachine');
     24    $this->is_dev = file_exists(ABSPATH . 'isdevmachine');
    2525  }
    2626
     
    3333  }
    3434
    35   public function actions(){
     35  public function actions() {
    3636    add_action( 'woocommerce_shipping_init', array( $this, 'shiptimize_init_shipping' ) );
    3737    add_action( 'wp_footer', array( $this, 'script_carriers_with_pickup' ) );
     
    157157      add_filter( 'woocommerce_shipping_methods', array($this, 'add_shipping_methods') );
    158158      add_filter( 'woocommerce_update_order_review_fragments', array( $this, 'shipping_fragments' ) , 200 );
    159       add_filter( 'woocommerce_review_order_after_order_total' , array( $this, 'shiptimize_shipping_options') , 200 ); //avoid conflicts with other plugins trying to print stuff Woo-wallet will print twice without this
     159      add_filter( 'woocommerce_review_order_before_payment' , array( $this, 'shiptimize_shipping_options') , 200 ); //avoid conflicts with other plugins trying to print stuff Woo-wallet will print twice without this
    160160  }
    161161
     
    211211
    212212    if(get_option('shiptimize_pickupdisable')){
    213       if ($this->is_dev) {
    214         error_log("pickup points are disabled");
    215       }
     213      WooShiptimize::log("pickup points are disabled"); 
    216214      return $fragments;
    217215    }
     
    220218    $choosen_methods_woo = WC()->session->get( 'chosen_shipping_methods' );
    221219
    222 
     220    WooShiptimize::log("Session " . var_export(WC()->session, true));
     221    WooShiptimize::log("Methods " . var_export($choosen_methods_woo, true));
    223222
    224223    if( isset($choosen_methods_woo[0]) ) {
     
    257256      }   
    258257    }
    259     else if ($this->is_dev) {
    260       error_log("No Shipping method was choosen ");
     258    else {
     259      WooShiptimize::log("No Shipping method was choosen ");
    261260    }
    262261
    263262    $fragments['.shiptimize-shipping-options'] = $shiptimize_options.'</table>';
    264 
     263 
    265264    return $fragments;
    266265  }
     
    285284    $HasPickup = false;
    286285
     286    WooShiptimize::log("is_carrier_pickup_able " . var_export($carrier,true));
    287287    if (isset($carrier->OptionList)) {
    288288      foreach($carrier->OptionList as $option) {
     
    294294            }
    295295          }
    296         } else if(isset($option->IsPickup) && $option->IsPickup) { // Points in regular options
     296        } else if(isset($option->IsPickup) && $option->IsPickup > 0) { // Points in regular options
    297297          WooShiptimize::log("HasPickup for $carrier->Name found in $option->Name");
    298298          $HasPickup = true;
     
    306306
    307307  public function get_settings_from_shipping_method_id($shipping_method) {
     308    if (!$shipping_method) {
     309      return;
     310    }
     311
    308312    $matches = array(); 
    309313    preg_match("/shipping_shiptimize_([0-9]+)[a-z0-9\_]*\:?([0-9]*)?/", $shipping_method, $matches);
     
    348352    }
    349353
     354    $pickupbehaviour = isset($settings['pickupbehaviour']) ? $settings['pickupbehaviour'] : '';
    350355    $shiptimizepoint = $fields['shiptimizepickup'];
    351 
    352     $msg .= "<br/>Selected Point:$shiptimizepoint\npickup [ " . $settings['pickupbehaviour'] ." ]\n<br/>Settings " . var_export($settings,true) ;
    353 
     356 
     357    $msg = "<br/>Selected Point:$shiptimizepoint\npickup [ " . $pickupbehaviour ." ]\n<br/>Settings " . var_export($settings,true) ;
    354358    WooShiptimize::log($msg);
    355 
    356     if (isset($settings['pickupbehaviour']) && $settings['pickupbehaviour'] == ShiptimizeOrder::$PICKUP_BEHAVIOUR_MANDATORY && !$shiptimizepoint) {
     359 
     360    if (isset($settings['pickupbehaviour']) && $pickupbehaviour == ShiptimizeOrder::$PICKUP_BEHAVIOUR_MANDATORY && !$shiptimizepoint) {
    357361      $errors->add( 'validation', $shiptimize->translate('mandatorypointmsg') ); 
    358362    }
     
    375379   */
    376380  public function add_shipping_methods($methods){
    377     $carriers = json_decode(get_option('shiptimize_carriers'));
    378      
    379     if (!$carriers) {
    380       return $methods;
    381     }
     381    $shiptimize_methods = get_option('shiptimize_carriers');
     382
     383    if(!$shiptimize_methods) {
     384      return $methods;
     385    }
     386
     387    $carriers = json_decode($shiptimize_methods);
    382388
    383389    foreach($carriers as $carrier){
     
    534540   *   @param int $orderid - optional - the order for which we are requesting this info 
    535541   */
    536   public function get_shiptimize_carrier($choosen_method, $order_id =''){
     542  public function get_shiptimize_carrier($choosen_method, $order_id ='') {
     543      WooShiptimize::log('choosen_method ' . $choosen_method);
     544
    537545      if(stripos($choosen_method, 'table_rate_plus')) {
    538546        return $this->get_shiptimize_carrier_from_table_rates($choosen_method, $order_id);
     
    694702
    695703    if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){
    696       error_log( $carrier->Name . " ".(  isset($carrier->OptionList ) ? json_encode( $carrier->OptionList )  :'' ));
     704      WooShiptimize::log( $carrier->Name . " ".(  isset($carrier->OptionList ) ? json_encode( $carrier->OptionList )  :'' ));
    697705    } 
    698706
     
    725733          );
    726734
     735          // how it's possible that someone declares this method before there's an instance of the plugin is a mistery to solve later
     736          // possible they copied the code and did their own  rendition of the thing?
     737          if(!\$shiptimize) {
     738            \$shiptimize = WooShiptimize::getInstance();
     739          }
     740
    727741          \$this->init();
    728742         
     
    775789    $class_file = fopen( $file_path , 'w' );
    776790    if( !fwrite( $class_file, $class_contents) ){
    777       error_log("can't write to path: $file_path, classfile: $class_file please check your file permissions "); 
     791      WooShiptimize::log("can't write to path: $file_path, classfile: $class_file please check your file permissions "); 
    778792    }
    779793   
     
    891905
    892906    if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){
    893       error_log( $carrier->Name . " ".(  isset($carrier->OptionList ) ? json_encode( $carrier->OptionList )  :'' ));
     907      WooShiptimize::log( $carrier->Name . " ".(  isset($carrier->OptionList ) ? json_encode( $carrier->OptionList )  :'' ));
    894908    } 
    895909
     
    11301144  }
    11311145}
    1132 
    1133 
    1134 ShiptimizeShipping::get_instance();
  • shiptimize-for-woocommerce/trunk/includes/class-woo-shiptimize-order.php

    r2722008 r2746465  
    178178
    179179        if( $product->has_weight() ) {
    180           $item_weight = wc_get_weight(floatval($qty * $product->get_weight()),'g');
     180          $productweight = $product->get_weight();
     181          if(is_numeric($qty) && is_numeric($productweight)) {
     182            $item_weight = wc_get_weight(floatval($qty * $productweight),'g');
     183          }
    181184          $weight += $item_weight;
    182185        }
     
    272275//  Regular woo shipping methods you add to zones     
    273276    else {
    274       if(WooShiptimize::$is_dev){
    275         error_log("Regular Woo method  will request shipping items  ");
    276       }
    277 
     277      WooShiptimize::log("Regular Woo method  will request shipping items  ");
     278     
    278279      $this->ShippingMethodName = $this->woo_order->get_shipping_method();
    279280      foreach ( $this->woo_order->get_items('shipping') as $item_id => $shipping_item  ){
     
    310311      }
    311312      else {
    312         error_log("Invalid service level id for order $this->ShopItemId. Did something change in the carrier settings ? ");
     313        WooShiptimize::log("Invalid service level id for order $this->ShopItemId. Did something change in the carrier settings ? ");
    313314      }
    314315    }
     
    366367   
    367368    if(!$this->woo_order){
    368       error_log("Invalid order to bootstrap with id $this->ShopItemId ");
     369      WooShiptimize::log("Invalid order to bootstrap with id $this->ShopItemId ");
    369370      return;
    370371    }
     
    440441    global $shiptimize; 
    441442
    442     if(WooShiptimize::$is_dev) {
    443       error_log("status update for order {$this->ShopItemId} => $status");   
    444     }
     443    WooShiptimize::log("status update for order {$this->ShopItemId} => $status");
    445444   
    446445    if(!isset(self::$api_status2wp_status[$status])){
    447         error_log("unknown status ignoring ");
     446        WooShiptimize::log("unknown status ignoring ");
    448447        return;
    449448    }
     
    808807      $order = new WooShiptimizeOrder($id);   
    809808      $ordermeta = $order->get_order_meta();
    810       if ( $ordermeta->status == ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY ) {
     809
     810      if ( isset($ordermeta->status) && $ordermeta->status == ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY ) {
    811811        array_push( $shiptimize_patch_orders, $order->get_api_props() );
    812812      }
  • shiptimize-for-woocommerce/trunk/includes/class-woo-shiptimize.php

    r2726206 r2746465  
    8383    global $wpdb;
    8484
    85     $this->db_prefix = $wpdb->prefix; 
    86 
    87     if(self::$is_dev){
    88       ini_set('display_errors', 1);
    89       ini_set('display_startup_errors', 1);
    90       error_reporting(E_ALL);
    91     }
     85    $this->db_prefix = $wpdb->prefix;   
    9286  }
    9387 
     
    10195
    10296    if ( is_null( self::$_instance ) ) {
     97      self::$is_dev = file_exists(ABSPATH . 'isdevmachine');
    10398      self::$_instance = new self();
    104       self::$is_dev = file_exists(ABSPATH . 'isdevmachine');
     99      self::shiptimize_check_upgrade();
    105100    }
    106101    return self::$_instance;
    107102  }
    108103
    109   public function bootstrap() {
     104  public function bootstrap() {
     105
     106    register_activation_hook(SHIPTIMIZE_PLUGIN_FILE, array($this, 'activate'));
     107    register_deactivation_hook(SHIPTIMIZE_PLUGIN_FILE, array($this, 'deactivate'));
     108    ShiptimizeShipping::get_instance();
     109
    110110    $active_plugins = (array) get_option( 'active_plugins', array() );
    111111    if ( is_multisite() ) {
     
    150150
    151151  /**
    152    * Check the database for current version and see if we need to update something
    153    */
    154   public function check_update(){
    155     global $shiptimize,$wpdb;
    156  
    157     if ( 'yes' === get_transient( 'shiptimize_upgrading' ) ) {
    158       return;
    159     }
    160  
    161     $current_version = get_option('shiptimize_version'); 
    162 
    163     if($current_version == WooShiptimize::$version){
    164       return;
    165     }
    166 
    167     // name, value, expires in seconds
    168     set_transient( 'shiptimize_upgrading', 'yes', 600 );
    169 
    170     if( $shiptimize->is_options_valid() ){
    171       self::refresh_token();
    172     }
    173 
    174     delete_transient( 'shiptimize_upgrading' );
    175     update_option('shiptimize_version', WooShiptimize::$version);
    176   }
    177 
    178 
    179   /**
    180152   * Declare the routes on activation, some plugins will rely on the flush rules to do stuff
    181153   * We can't load it everytime the plugin loads
     
    185157    global $wpdb;
    186158
    187     update_option('shiptimize_db_version', self::$database_version);
    188 
    189     if ( self::$is_dev ) {
    190       error_log("Activating " . (is_multisite() ? 'multisite' : 'regular') . " network_wide:  $network_wide");
    191     }
    192 
    193     if ( is_multisite() && $network_wide ) {
    194         error_log(var_export(get_sites(['fields'=>'ids']),true));
    195         foreach (get_sites(['fields'=>'ids']) as $blog_id) {
    196             switch_to_blog($blog_id);
    197             if ( self::$is_dev ) {
    198               error_log("Activating site: " . site_url());
    199             }
    200             //This class is a singleton foreach site we need to update this manually if iterating several sites
    201             $shiptimize =  WooShiptimize::instance();
    202             $shiptimize->db_prefix = $wpdb->prefix;   
    203             WooShiptimize::_active_site($network_wide);
    204             restore_current_blog();
    205         }
    206 
    207     } else {
    208       WooShiptimize::_active_site($network_wide);
     159    $database_version = get_option('shiptimize_db_version');
     160    self::log("Activating " . (is_multisite() ? 'multisite' : 'regular') . " network_wide:  $network_wide current_db " . $database_version . "plugindb " . self::$database_version);
     161
     162    if($database_version < self::$database_version) {
     163     
     164      if ( is_multisite() && $network_wide ) {
     165         
     166          foreach (get_sites( ['fields'=>'ids'] ) as $blog_id) {
     167              switch_to_blog($blog_id);
     168
     169              self::log("Activating site: " . site_url());
     170
     171              //This class is a singleton foreach site we need to update this manually if iterating several sites
     172              $shiptimize =  WooShiptimize::instance();
     173              $shiptimize->db_prefix = $wpdb->prefix;   
     174              WooShiptimize::_active_site($network_wide);
     175              restore_current_blog();
     176          }
     177
     178      } else {
     179        WooShiptimize::_active_site($network_wide);
     180      }
     181
     182      update_option( 'shiptimize_db_version', self::$database_version );
    209183    }
    210184  }
     
    220194    $shiptimize = WooShiptimize::instance();
    221195    $shiptimize->create_shiptimize_data_model('bigint(20) unsigned ');
    222 
    223     if( !$network_wide && $shiptimize->is_options_valid() ){
    224       self::refresh_token();
    225     }
    226 
    227196    ShiptimizeMarketplace::activate($network_wide);
    228197  }
     
    234203   */
    235204  public function actions( ) {
     205    add_action( 'plugins_loaded', array( $this,'plugins_loaded' ) );
     206
     207    add_action( 'upgrader_process_complete', array( $this,'upgrade_function' ) ,10, 2);
     208
    236209    add_action('admin_enqueue_scripts', array( $this, 'shiptimize_admin_styles' ) );
    237210    add_action('admin_enqueue_scripts', array( $this, 'shiptimize_admin_scripts' ) );
     
    255228      add_action( $action_name , array($this, 'auto_export'));
    256229    }
    257 
    258  
    259   }
     230  }
     231
     232  public function plugins_loaded() {
     233    $this->check_marketplaces();
     234    $this->load_plugin_textdomain();
     235  }
     236
     237  public function check_marketplaces() { 
     238    global $shiptimize_dokan,$shiptimize_wcfm;
     239
     240    $active_plugins =  apply_filters('active_plugins', get_option( 'active_plugins' ));
     241    if ( in_array( 'dokan-lite/dokan.php', $active_plugins )) {
     242      require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-dokan.php');
     243    }
     244
     245    if (in_array('wc-multivendor-marketplace/wc-multivendor-marketplace.php', $active_plugins)) {
     246      require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-wcfm.php');
     247    }
     248  }
     249
     250  public function upgrade_function( $upgrader_object, $options ) {
     251        global $shiptimize;
     252
     253        $current_plugin_path_name = plugin_basename( __FILE__ );
     254       
     255        if ($options['action'] == 'update' && $options['type'] == 'plugin' ){
     256           foreach($options['plugins'] as $each_plugin){
     257              if ($each_plugin==$current_plugin_path_name){
     258                $shiptimize->check_update();
     259              }
     260            }
     261        }
     262  } 
     263
     264  public function load_plugin_textdomain() {
     265    global $shiptimize;
     266
     267    load_plugin_textdomain( 'shiptimize-for-woocommerce', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); 
     268  }
    260269
    261270  /** 
     
    265274    global $wpdb;
    266275
    267     if( self::$is_dev){
    268       error_log("Auto export order_id: $order_id ");
    269     }       
     276    self::log("Auto export order_id: $order_id "); 
    270277
    271278    $exported = $wpdb->get_results("select status from {$wpdb->prefix}shiptimize where id=$order_id ");
    272279
    273     if(self::$is_dev){
    274       error_log("Exported " . var_export($exported,true));
    275     }
     280    self::log("Exported " . var_export($exported,true)); 
    276281
    277282    if (!$exported || ($exported[0]->status != ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY) ) {     
     
    279284    }
    280285    else if( self::$is_dev) {
    281       error_log("order $order_id was already exported status is $exported[0]->status:  ignore");
     286      self::log("order $order_id was already exported status is $exported[0]->status:  ignore");
    282287    }
    283288  }
     
    354359    //Receive the RAW post data via the php://input IO stream.
    355360    $content = file_get_contents("php://input");   
    356     self::log(" API_UPDATE ".var_export($content,true), true);
     361    self::log(" API_UPDATE ".var_export($content,true));
    357362
    358363      if(!trim($content)){
     
    376381
    377382     
    378       error_log("\n\nHEADERS:\n" . json_encode(getallheaders()) . "\n\n");
    379      
    380 
    381383      if (isset($data->Action) && $data->Action == 'getshippingmethods') {
    382384        echo ShiptimizeShipping::get_shipping_methods();
     
    401403        'methods'  => WP_REST_Server::CREATABLE,
    402404        'callback' => array($this, 'api_update'),
     405        'permission_callback' => '__return_true',
    403406    ) );
    404407
     
    407410        'methods'  => WP_REST_Server::READABLE,
    408411        'callback' => array($this, 'api_update'),
     412        'permission_callback' => '__return_true',
    409413    ) );
    410414  }
     
    679683
    680684      if(class_exists('ShiptimizeShipping')){
    681         if ( self::$is_dev ) {
    682           error_log("clear_carrier_classes");
    683         }
     685        self::log("clear_carrier_classes");
    684686        ShiptimizeShipping::clear_carrier_classes();     
    685687      }
    686688      else {
    687689        $message  = "Class ShiptimizeShipping not found; can't update the carrier classes. File should be at " . SHIPTIMIZE_PLUGIN_PATH . 'includes/admin/class-shiptimize-shipping.php. Does the file exist? ' . (file_exists(SHIPTIMIZE_PLUGIN_PATH . 'includes/admin/class-shiptimize-shipping.php') ? 'Yes': 'No');
    688         error_log($message);
     690        self::log($message);
    689691      }
    690692
     
    783785
    784786      if(self::$is_dev) {
    785         error_log("\n" . date("Y-m-d H:i:s") . "\t" . $msg, 3, SHIPTIMIZE_PLUGIN_PATH . '/shiptimize.log'); 
     787        error_log("\n" . date("Y-m-d H:i:s") . "\t" . $msg);//, 3, SHIPTIMIZE_PLUGIN_PATH . '/shiptimize.log');
    786788      }
    787789      else {
     
    821823    catch (Exception $e) {
    822824      $contentvalid = false;
    823       WooShiptimize::log($e->getMessage());
     825      self::log($e->getMessage());
    824826    }
    825827 
     
    827829    return $contentvalid;
    828830  }
     831
     832    /**
     833   * Check if we need to run any upgrade functions
     834   * All elements in this function should be idempotent
     835   **/
     836  static function shiptimize_check_upgrade () {
     837    global $wpdb;
     838
     839    $current_version = get_option('shiptimize_app_version'); 
     840    $current_version = floatval($current_version);
     841   
     842    if($current_version >= floatval(SHIPTIMIZE_VERSION) ) {   
     843      return;
     844    }
     845
     846    WooShiptimize::log("Shiptimize Upgrade from $current_version ",1);
     847
     848    // Label creation table changes introduced in v3.1.34
     849    $ordercolumns = $wpdb->get_results("show columns from {$wpdb->prefix}shiptimize where field='labelurl'");
     850   
     851    if(!isset($ordercolumns[0]->Field)) {
     852      WooShiptimize::log("Updating shiptimize datamodel to include label creation "); 
     853      $wpdb->query("alter table " . $wpdb->prefix . "shiptimize  add column labelurl varchar(255) null");
     854    }   
     855
     856    if ( !get_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY ) && get_option( WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY ) ) {
     857      update_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY, get_option(WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY) );
     858      update_option( WooShiptimize::$OPTION_CALLBACK_URL , WooShiptimize::get_callback_url());
     859    }
     860
     861    update_option('shiptimize_app_version',SHIPTIMIZE_VERSION);
     862  }
    829863}
    830 
    831 register_activation_hook(SHIPTIMIZE_PLUGIN_FILE, array('WooShiptimize', 'activate'));
    832 register_deactivation_hook(SHIPTIMIZE_PLUGIN_FILE, array('WooShiptimize', 'deactivate'));
  • shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize-api-v3.php

    r2722008 r2746465  
    452452     * @override
    453453     */
    454     protected function send_to_api($method = 'GET', $endpoint, $data = '', $headers = array())
     454    protected function send_to_api($method = 'GET', $endpoint = '/', $data = '', $headers = array())
    455455    {
    456456        $result = new \stdClass();
  • shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize-order.php

    r2705717 r2746465  
    766766            } 
    767767            else {
    768                 error_log("invalid char o: $o - c:[$c]");
     768                ///error_log("invalid char o: $o - c:[$c]");
    769769                $str2 .= ' ';
    770770            }               
  • shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize.php

    r2705717 r2746465  
    2929     * @var string
    3030     */
    31     protected static $database_version = "1.0";
     31    protected static $database_version = "2.0";
    3232
    3333    /**
  • shiptimize-for-woocommerce/trunk/includes/core/lang/en.php

    r2726206 r2746465  
    9898    'printsuccesseddescription' => 'Label successfully printed',
    9999    'printerrordescription' => 'Label request <u>returned errors</u>',
    100     'useapititle' => 'Use WP API',
     100    'useapititle' => 'Issues with order status updates?',
    101101    'usewpapi' => "Use the woordpress API to send back order updates",
    102102    'useapihelpinactive' => "<p>When you have configured order statusses to be automatically updated at certain events (on import, label create, and/or delivered) but you see <i>‘not found’</i> results in the tracking updates for shipments in your Shiptimize account the plugin could update order status updates via the WordPress API as an alternative. </p>
  • shiptimize-for-woocommerce/trunk/includes/core/lang/pt.php

    r2726206 r2746465  
    113113    'printsuccesseddescription' => 'Etiqueta obtida com sucesso',
    114114    'printerrordescription' => '<u>Erros</u> ao obter a label',
    115     'useapititle' => 'API do WP',
     115    'useapititle' => 'API do Wordpress',
    116116    'usewpapi' => "Receber actualizações de estado através da API do woordpress",
    117     'useapihelpinactive' => "<p>Quando configura actualizações de estado automaticas (ao importar, criar label ou entregue) mas encontra 'Not Found' nas actualizações de encomenda deve escolher receber as actualizações através da API do Woocommerce. </p>
     117    'useapihelpinactive' => "<p>Quando configura actualizações de estado automaticas (ao importar, criar etiqueta ) mas encontra 'Not Found' nas actualizações de encomenda; deve escolher receber as actualizações através da API do Wordpress. </p>
    118118<p> No entanto, a API do Wordpress parece não estar activa no seu site, pelo que não podemos facultar-lhe uma alternativa. Fale com o seu programador sobre isto.
    119119<br/> %s</p>
    120120    ",
    121     'useapihelp' => 'Quando configura actualizações de estado automaticas (ao importar, criar label ou entregue) mas encontra "Not Found" nas actualizações de encomenda deve escolher receber as actualizações através da API do Woocommerce.
     121    'useapihelp' => 'Quando configura actualizações de estado automaticas (ao importar, criar etiqueta ) mas encontra "Not Found" nas actualizações de encomenda; deve escolher receber as actualizações através da API do Wordpress.
    122122    Siga os seguintes passos:
    123123<ol>
    124     <li>Active a opção de receber actualizações usando a API do Woordpress abaixo. %s </li>
     124    <li>Active a opção de receber actualizações usando a API do Wordpress abaixo. %s </li>
    125125    <li>Na sua conta na aplicação, crie novas chaves em "Definições" > "Integrações" > "Gestão de Chaves".</li>
    126126    <li>Active as chaves</li>
    127     <li>Copie e cole as chages que gerou nas configurações da Shiptimize nest site
     127    <li>Copie as chaves que gerou nas configurações da Shiptimize para as configurações do plugin.
    128128    </li>
    129129    <li>Clique em "Salvar Alterações".</li>
  • shiptimize-for-woocommerce/trunk/readme.txt

    r2726206 r2746465  
    33Tags: shipping, multi carrier, save, automate, woocommerce
    44Requires at least: 4.9
    5 Tested up to: 5.9
     5Tested up to: 6.0
    66Requires PHP: 5.6
    77Stable tag: trunk
  • shiptimize-for-woocommerce/trunk/shiptimize.php

    r2726206 r2746465  
    33 * Plugin Name: Shiptimize for WooCommerce
    44 * Description: Shiptimize for WooCommerce 
    5  * Version: 3.1.45
     5 * Version: 3.1.47
    66 * Author: Shiptimize
    77 * Author URI: https://shiptimize.me
     
    2020}
    2121
    22 
    23 # For reasons unknown some websites will return http instead of https with plugin_dir_url
    24 # Suspect is W3 Total cache
    25 #
    26 $plugin_url = plugin_dir_url( __FILE__ );
    27 # Get rid of the protocol entirely
    28 $plugin_url = preg_replace('/https?\:/', '', $plugin_url ); 
     22/**
     23 * There's nothing for us to do in cron tasks
     24 */
     25if ( wp_doing_cron() )
     26{
     27 return;
     28}
    2929
    3030define( 'SHIPTIMIZE_DEV', file_exists('isdevmachine') ? 1 : 0 );
    3131define( 'SHIPTIMIZE_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
    3232define( 'SHIPTIMIZE_PLUGIN_FILE',  __FILE__ );
    33 define( 'SHIPTIMIZE_PLUGIN_URL',  $plugin_url );
     33define( 'SHIPTIMIZE_PLUGIN_URL',  plugin_dir_url( __FILE__ ) );
    3434define( 'SHIPTIMIZE_LOGO', SHIPTIMIZE_PLUGIN_URL . 'assets/images/logo.svg' );
    3535
     36
    3637require_once(SHIPTIMIZE_PLUGIN_PATH . '/constants.php');
    37 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/class-woo-shiptimize.php'); 
    38 
    39 function shiptimize_load_plugin_textdomain() {
    40     global $shiptimize;
    41 
    42     load_plugin_textdomain( 'shiptimize-for-woocommerce', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); 
    43 
    44     if($shiptimize){
    45       $shiptimize->check_update();     
    46     }
    47 }
    48 
    49 add_action( 'plugins_loaded', 'shiptimize_load_plugin_textdomain' );
    50 add_action( 'plugins_loaded', 'check_marketplaces');
    51 
    52 add_action( 'upgrader_process_complete', 'shiptimize_upgrade_function',10, 2);
    53 
    54 function shiptimize_upgrade_function( $upgrader_object, $options ) {
    55     global $shiptimize;
    56 
    57     $current_plugin_path_name = plugin_basename( __FILE__ );
    58    
    59     if ($options['action'] == 'update' && $options['type'] == 'plugin' ){
    60        foreach($options['plugins'] as $each_plugin){
    61           if ($each_plugin==$current_plugin_path_name){
    62             $shiptimize->check_update();
    63           }
    64         }
    65     }
    66 }
    67 
    68 /**
    69  * Check if we need to run any upgrade functions
    70  **/
    71 function shiptimize_check_upgrade () {
    72   global $wpdb;
    73 
    74   $current_version = get_option('shiptimize_db_version');
    75   $current_version = str_replace('.', "",$current_version);
    76  
    77   if($current_version > 2 ) {   
    78     return;
    79   }
    80 
    81   WooShiptimize::log("Shiptimize Upgrade from $current_version ",1);
    82 
    83   // Label creation table changes introduced in v3.1.34
    84   $shiptimizeorder = $wpdb->get_results("select status from {$wpdb->prefix}shiptimize limit 0,1");
    85 
    86   if(!isset($shiptimizeorder['labelurl'])) {
    87     error_log("Updating shiptimize datamodel to include label creation "); 
    88     $wpdb->query("alter table " . $wpdb->prefix . "shiptimize  add column labelurl varchar(255) null");
    89   }   
    90 
    91   if ( !get_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY ) && get_option( WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY ) ) {
    92     update_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY, get_option(WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY) );
    93     update_option( WooShiptimize::$OPTION_CALLBACK_URL , WooShiptimize::get_callback_url());
    94   }
    95 
    96   update_option('shiptimize_db_version','3');
    97 }
     38require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/class-woo-shiptimize.php');   
    9839
    9940/**
     
    10849}
    10950
    110 function check_marketplaces() { 
    111   global $shiptimize_dokan,$shiptimize_wcfm;
    112 
    113   $active_plugins =  apply_filters('active_plugins', get_option( 'active_plugins' ));
    114   if ( in_array( 'dokan-lite/dokan.php', $active_plugins )) {
    115     require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-dokan.php');
    116   }
    117 
    118   if (in_array('wc-multivendor-marketplace/wc-multivendor-marketplace.php', $active_plugins)) {
    119     require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-wcfm.php');
    120   }
    121 }
    122 
    123 shiptimize_check_upgrade();
    124 
    12551$shiptimize = WooShiptimize::instance();
    12652$shiptimize->bootstrap();
     53
Note: See TracChangeset for help on using the changeset viewer.