Want to know more about our gum disease treatments? Or why maintaining healthy gums is so important? Download our FREE guide here!
Your Guide to Gum Disease

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLSBKQVZBU0NSSVBUIEhPT0sgRlVOQ1RJT05TIEZPUiBHUkFWSVRZIEZPUk1TIC0tLS0tLS0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoICEgZ2Zvcm0gKSB7Cglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5zY3JpcHRzTG9hZGVkID0gdHJ1ZTsgfSApOwoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgZnVuY3Rpb24oKSB7IGdmb3JtLnRoZW1lU2NyaXB0c0xvYWRlZCA9IHRydWU7IH0gKTsKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5kb21Mb2FkZWQgPSB0cnVlOyB9ICk7CgoJdmFyIGdmb3JtID0gewoJCWRvbUxvYWRlZDogZmFsc2UsCgkJc2NyaXB0c0xvYWRlZDogZmFsc2UsCgkJdGhlbWVTY3JpcHRzTG9hZGVkOiBmYWxzZSwKCQlpc0Zvcm1FZGl0b3I6ICgpID0+IHR5cGVvZiBJbml0aWFsaXplRWRpdG9yID09PSAnZnVuY3Rpb24nLAoKCQkvKioKCQkgKiBAZGVwcmVjYXRlZCAyLjkgdGhlIHVzZSBvZiBpbml0aWFsaXplT25Mb2FkZWQgaW4gdGhlIGZvcm0gZWRpdG9yIGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KCQkgKiBAcmVtb3ZlLWluIDQuMCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIGZvciBnZm9ybS5pc0Zvcm1FZGl0b3IoKS4KCQkgKi8KCQljYWxsSWZMb2FkZWQ6IGZ1bmN0aW9uICggZm4gKSB7CgkJCWlmICggZ2Zvcm0uZG9tTG9hZGVkICYmIGdmb3JtLnNjcmlwdHNMb2FkZWQgJiYgKCBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgfHwgZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSApIHsKCQkJCWlmICggZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSB7CgkJCQkJY29uc29sZS53YXJuKCAnVGhlIHVzZSBvZiBnZm9ybS5pbml0aWFsaXplT25Mb2FkZWQoKSBpcyBkZXByZWNhdGVkIGluIHRoZSBmb3JtIGVkaXRvciBjb250ZXh0IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3Jhdml0eSBGb3JtcyAzLjEuJyApOwoJCQkJfQoJCQkJZm4oKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvKioKCQkgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcGFyYW0gZnVuY3Rpb24gZm4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcmV0dXJucyB2b2lkCgkJICovCgkJaW5pdGlhbGl6ZU9uTG9hZGVkOiBmdW5jdGlvbiggZm4gKSB7CgkJCWlmICggISBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICkgKSB7CgkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsICgpID0+IHsgZ2Zvcm0uc2NyaXB0c0xvYWRlZCA9IHRydWU7IGdmb3JtLmNhbGxJZkxvYWRlZCggZm4gKTsgfSApOwoJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgKCkgPT4geyBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgPSB0cnVlOyBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICk7IH0gKTsKCQkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgZ2Zvcm0uZG9tTG9hZGVkID0gdHJ1ZTsgZ2Zvcm0uY2FsbElmTG9hZGVkKCBmbiApOyB9ICk7CgkJCX0KCQl9LAoKCQlob29rczogeyBhY3Rpb246IHt9LCBmaWx0ZXI6IHt9IH0sCgkJYWRkQWN0aW9uOiBmdW5jdGlvbiggYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJZ2Zvcm0uYWRkSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEZpbHRlcjogZnVuY3Rpb24oIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLmFkZEhvb2soICdmaWx0ZXInLCBhY3Rpb24sIGNhbGxhYmxlLCBwcmlvcml0eSwgdGFnICk7CgkJfSwKCQlkb0FjdGlvbjogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJZ2Zvcm0uZG9Ib29rKCAnYWN0aW9uJywgYWN0aW9uLCBhcmd1bWVudHMgKTsKCQl9LAoJCWFwcGx5RmlsdGVyczogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJcmV0dXJuIGdmb3JtLmRvSG9vayggJ2ZpbHRlcicsIGFjdGlvbiwgYXJndW1lbnRzICk7CgkJfSwKCQlyZW1vdmVBY3Rpb246IGZ1bmN0aW9uKCBhY3Rpb24sIHRhZyApIHsKCQkJZ2Zvcm0ucmVtb3ZlSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgdGFnICk7CgkJfSwKCQlyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uKCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLnJlbW92ZUhvb2soICdmaWx0ZXInLCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEhvb2s6IGZ1bmN0aW9uKCBob29rVHlwZSwgYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgPT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQlnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXSA9IFtdOwoJCQl9CgkJCXZhciBob29rcyA9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dOwoJCQlpZiAoIHVuZGVmaW5lZCA9PSB0YWcgKSB7CgkJCQl0YWcgPSBhY3Rpb24gKyAnXycgKyBob29rcy5sZW5ndGg7CgkJCX0KCQkJaWYoIHByaW9yaXR5ID09IHVuZGVmaW5lZCApewoJCQkJcHJpb3JpdHkgPSAxMDsKCQkJfQoKCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0ucHVzaCggeyB0YWc6dGFnLCBjYWxsYWJsZTpjYWxsYWJsZSwgcHJpb3JpdHk6cHJpb3JpdHkgfSApOwoJCX0sCgkJZG9Ib29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgYXJncyApIHsKCgkJCS8vIHNwbGljZSBhcmdzIGZyb20gb2JqZWN0IGludG8gYXJyYXkgYW5kIHJlbW92ZSBmaXJzdCBpbmRleCB3aGljaCBpcyB0aGUgaG9vayBuYW1lCgkJCWFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKTsKCgkJCWlmICggdW5kZWZpbmVkICE9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dICkgewoJCQkJdmFyIGhvb2tzID0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0sIGhvb2s7CgkJCQkvL3NvcnQgYnkgcHJpb3JpdHkKCQkJCWhvb2tzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsicHJpb3JpdHkiXS1iWyJwcmlvcml0eSJdfSk7CgoJCQkJaG9va3MuZm9yRWFjaCggZnVuY3Rpb24oIGhvb2tJdGVtICkgewoJCQkJCWhvb2sgPSBob29rSXRlbS5jYWxsYWJsZTsKCgkJCQkJaWYodHlwZW9mIGhvb2sgIT0gJ2Z1bmN0aW9uJykKCQkJCQkJaG9vayA9IHdpbmRvd1tob29rXTsKCQkJCQlpZiAoICdhY3Rpb24nID09IGhvb2tUeXBlICkgewoJCQkJCQlob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFyZ3NbMF0gPSBob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0KCQkJCX0gKTsKCQkJfQoJCQlpZiAoICdmaWx0ZXInPT1ob29rVHlwZSApIHsKCQkJCXJldHVybiBhcmdzWzBdOwoJCQl9CgkJfSwKCQlyZW1vdmVIb29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgIT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQl2YXIgaG9va3MgPSBnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXTsKCQkJCWhvb2tzID0gaG9va3MuZmlsdGVyKCBmdW5jdGlvbihob29rLCBpbmRleCwgYXJyKSB7CgkJCQkJdmFyIHJlbW92ZUhvb2sgPSAodW5kZWZpbmVkPT10YWd8fHRhZz09aG9vay50YWcpICYmICh1bmRlZmluZWQ9PXByaW9yaXR5fHxwcmlvcml0eT09aG9vay5wcmlvcml0eSk7CgkJCQkJcmV0dXJuICFyZW1vdmVIb29rOwoJCQkJfSApOwoJCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gPSBob29rczsKCQkJfQoJCX0KCX07Cn0KCi8qIF1dPiAqLwo8L3NjcmlwdD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdnZl9icm93c2VyX2dlY2tvIGdmb3JtX3dyYXBwZXIgZ2Zvcm1fbGVnYWN5X21hcmt1cF93cmFwcGVyIGdmb3JtLXRoZW1lLS1uby1mcmFtZXdvcmsgY29udGFjdC1mb3Jtc193cmFwcGVyIGdwbGFjZWhvbGRlcl93cmFwcGVyJyBkYXRhLWZvcm0tdGhlbWU9J2xlZ2FjeScgZGF0YS1mb3JtLWluZGV4PScwJyBpZD0nZ2Zvcm1fd3JhcHBlcl8xMScgPjxkaXYgaWQ9J2dmXzExJyBjbGFzcz0nZ2Zvcm1fYW5jaG9yJyB0YWJpbmRleD0nLTEnPjwvZGl2Pjxmb3JtIG1ldGhvZD0ncG9zdCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScgdGFyZ2V0PSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fMTEnIGNsYXNzPSdjb250YWN0LWZvcm1zIGdwbGFjZWhvbGRlcicgYWN0aW9uPScvcGF0aWVudC1jZW50cmUvYmxvZy8jZ2ZfMTEnIGRhdGEtZm9ybWlkPScxMScgbm92YWxpZGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZ2Zvcm0tYm9keSBnZm9ybV9ib2R5Jz48dWwgaWQ9J2dmb3JtX2ZpZWxkc18xMScgY2xhc3M9J2dmb3JtX2ZpZWxkcyB0b3BfbGFiZWwgZm9ybV9zdWJsYWJlbF9iZWxvdyBkZXNjcmlwdGlvbl9iZWxvdyB2YWxpZGF0aW9uX2JlbG93Jz48bGkgaWQ9ImZpZWxkXzExXzIxIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1ob25leXBvdCBnZm9ybV92YWxpZGF0aW9uX2NvbnRhaW5lciBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLWhhcy1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICA+PGxhYmVsIGNsYXNzPSdnZmllbGRfbGFiZWwgZ2Zvcm0tZmllbGQtbGFiZWwnIGZvcj0naW5wdXRfMTFfMjEnPk5hbWU8L2xhYmVsPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXInPjxpbnB1dCBuYW1lPSdpbnB1dF8yMScgaWQ9J2lucHV0XzExXzIxJyB0eXBlPSd0ZXh0JyB2YWx1ZT0nJyBhdXRvY29tcGxldGU9J25ldy1wYXNzd29yZCcvPjwvZGl2PjxkaXYgY2xhc3M9J2dmaWVsZF9kZXNjcmlwdGlvbicgaWQ9J2dmaWVsZF9kZXNjcmlwdGlvbl8xMV8yMSc+VGhpcyBmaWVsZCBpcyBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xMCIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtdGV4dCBnZmllbGRfY29udGFpbnNfcmVxdWlyZWQgZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBoaWRkZW5fbGFiZWwgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgPjxsYWJlbCBjbGFzcz0nZ2ZpZWxkX2xhYmVsIGdmb3JtLWZpZWxkLWxhYmVsJyBmb3I9J2lucHV0XzExXzEwJz5Zb3VyIE5hbWU8c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIj48c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIGdmaWVsZF9yZXF1aXJlZF9hc3RlcmlzayI+Kjwvc3Bhbj48L3NwYW4+PC9sYWJlbD48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzEwJyBpZD0naW5wdXRfMTFfMTAnIHR5cGU9J3RleHQnIHZhbHVlPScnIGNsYXNzPSdsYXJnZScgICB0YWJpbmRleD0nNTAnIHBsYWNlaG9sZGVyPSdZb3VyIE5hbWUgKicgYXJpYS1yZXF1aXJlZD0idHJ1ZSIgYXJpYS1pbnZhbGlkPSJmYWxzZSIgICAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8zIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1lbWFpbCBnZmllbGRfY29udGFpbnNfcmVxdWlyZWQgZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBoaWRkZW5fbGFiZWwgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgPjxsYWJlbCBjbGFzcz0nZ2ZpZWxkX2xhYmVsIGdmb3JtLWZpZWxkLWxhYmVsJyBmb3I9J2lucHV0XzExXzMnPllvdXIgRW1haWw8c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIj48c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIGdmaWVsZF9yZXF1aXJlZF9hc3RlcmlzayI+Kjwvc3Bhbj48L3NwYW4+PC9sYWJlbD48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfZW1haWwnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9J2lucHV0XzMnIGlkPSdpbnB1dF8xMV8zJyB0eXBlPSdlbWFpbCcgdmFsdWU9JycgY2xhc3M9J2xhcmdlJyB0YWJpbmRleD0nNTEnICBwbGFjZWhvbGRlcj0nWW91ciBFbWFpbCAqJyBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWludmFsaWQ9ImZhbHNlIiAgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE3IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTcnIGlkPSdpbnB1dF8xMV8xNycgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JzEyNDUnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE1IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTUnIGlkPSdpbnB1dF8xMV8xNScgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9J0d1bSBEaXNlYXNlIEd1aWRlJyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xNiIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzE2JyBpZD0naW5wdXRfMTFfMTYnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPScnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE4IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTgnIGlkPSdpbnB1dF8xMV8xOCcgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JycgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMjAiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8yMCcgaWQ9J2lucHV0XzExXzIwJyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nJyAvPjwvZGl2PjwvbGk+PC91bD48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSdnZm9ybS1mb290ZXIgZ2Zvcm1fZm9vdGVyIHRvcF9sYWJlbCc+IAoJCTxkaXYgY2xhc3M9InNlY3Rpb24tYnV0dG9uIj4KCSAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGlkPSJnZm9ybV9zdWJtaXRfYnV0dG9uXzExIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij4KCQkgICAgICAgIERvd25sb2FkIG5vdwoJCQk8L2J1dHRvbj4KCQk8L2Rpdj4KICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdnZm9ybV9hamF4JyB2YWx1ZT0nZm9ybV9pZD0xMSZhbXA7dGl0bGU9JmFtcDtkZXNjcmlwdGlvbj0mYW1wO3RhYmluZGV4PTUwJmFtcDt0aGVtZT1sZWdhY3kmYW1wO3N0eWxlcz1bXSZhbXA7aGFzaD1hOWQ5NGViNGUyNDhkMTBiNWM2ZWRmNGM2NTZiM2UxYScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3VibWlzc2lvbl9tZXRob2QnIGRhdGEtanM9J2dmb3JtX3N1Ym1pc3Npb25fbWV0aG9kXzExJyB2YWx1ZT0naWZyYW1lJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV90aGVtZScgZGF0YS1qcz0nZ2Zvcm1fdGhlbWVfMTEnIGlkPSdnZm9ybV90aGVtZV8xMScgdmFsdWU9J2xlZ2FjeScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3R5bGVfc2V0dGluZ3MnIGRhdGEtanM9J2dmb3JtX3N0eWxlX3NldHRpbmdzXzExJyBpZD0nZ2Zvcm1fc3R5bGVfc2V0dGluZ3NfMTEnIHZhbHVlPSdbXScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0naXNfc3VibWl0XzExJyB2YWx1ZT0nMScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3VibWl0JyB2YWx1ZT0nMTEnIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV9jdXJyZW5jeScgZGF0YS1jdXJyZW5jeT0nVVNEJyB2YWx1ZT0nQ1FzQllwVHFiaE4yamswRFVwSFUyc1p4Q0FhdVNHb2NWVlA2ZU0rYkxlSTAzdFNCYWFIL3hMV0Z3ZnFFRHhDcm9SVmRKeENWcU5FVndlcFJNejNwRmFqUkZLYVhBWGJ6Z3N5Z01DTEgyYmhTaHNFPScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fdW5pcXVlX2lkJyB2YWx1ZT0nJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdzdGF0ZV8xMScgdmFsdWU9J1d5SmJYU0lzSW1RNFpqQXhZek5rTTJRek1UQTRNVEZqT0dFM1l6YzRaV1UyWVRZd016ZG1JbDA9JyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBhdXRvY29tcGxldGU9J29mZicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fdGFyZ2V0X3BhZ2VfbnVtYmVyXzExJyBpZD0nZ2Zvcm1fdGFyZ2V0X3BhZ2VfbnVtYmVyXzExJyB2YWx1ZT0nMCcgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgYXV0b2NvbXBsZXRlPSdvZmYnIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScgaWQ9J2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScgdmFsdWU9JzEnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2dmb3JtX2ZpZWxkX3ZhbHVlcycgdmFsdWU9J2Vib29rX2lkPTEyNDUmYW1wO2Vib29rX2FjdGl2ZV9jYW1wYWlnbl90YWc9R3VtK0Rpc2Vhc2UrR3VpZGUnIC8+CiAgICAgICAgICAgIAogICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoJCSAgICAgICAgICAgICAgICA8aWZyYW1lIHN0eWxlPSdkaXNwbGF5Om5vbmU7d2lkdGg6MHB4O2hlaWdodDowcHg7JyBzcmM9J2Fib3V0OmJsYW5rJyBuYW1lPSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fYWpheF9mcmFtZV8xMScgdGl0bGU9J1RoaXMgaWZyYW1lIGNvbnRhaW5zIHRoZSBsb2dpYyByZXF1aXJlZCB0byBoYW5kbGUgQWpheCBwb3dlcmVkIEdyYXZpdHkgRm9ybXMuJz48L2lmcmFtZT4KCQkgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KIGdmb3JtLmluaXRpYWxpemVPbkxvYWRlZCggZnVuY3Rpb24oKSB7Z2Zvcm1Jbml0U3Bpbm5lciggMTEsICdodHRwczovL3BhY2lmaWNwZXJpby5jb20uYXUvd3AtY29udGVudC9wbHVnaW5zL2dyYXZpdHlmb3Jtcy9pbWFnZXMvc3Bpbm5lci5zdmcnLCB0cnVlICk7alF1ZXJ5KCcjZ2Zvcm1fYWpheF9mcmFtZV8xMScpLm9uKCdsb2FkJyxmdW5jdGlvbigpe3ZhciBjb250ZW50cyA9IGpRdWVyeSh0aGlzKS5jb250ZW50cygpLmZpbmQoJyonKS5odG1sKCk7dmFyIGlzX3Bvc3RiYWNrID0gY29udGVudHMuaW5kZXhPZignR0ZfQUpBWF9QT1NUQkFDSycpID49IDA7aWYoIWlzX3Bvc3RiYWNrKXtyZXR1cm47fXZhciBmb3JtX2NvbnRlbnQgPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcjZ2Zvcm1fd3JhcHBlcl8xMScpO3ZhciBpc19jb25maXJtYXRpb24gPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcjZ2Zvcm1fY29uZmlybWF0aW9uX3dyYXBwZXJfMTEnKS5sZW5ndGggPiAwO3ZhciBpc19yZWRpcmVjdCA9IGNvbnRlbnRzLmluZGV4T2YoJ2dmb3JtUmVkaXJlY3QoKXsnKSA+PSAwO3ZhciBpc19mb3JtID0gZm9ybV9jb250ZW50Lmxlbmd0aCA+IDAgJiYgISBpc19yZWRpcmVjdCAmJiAhIGlzX2NvbmZpcm1hdGlvbjt2YXIgbXQgPSBwYXJzZUludChqUXVlcnkoJ2h0bWwnKS5jc3MoJ21hcmdpbi10b3AnKSwgMTApICsgcGFyc2VJbnQoalF1ZXJ5KCdib2R5JykuY3NzKCdtYXJnaW4tdG9wJyksIDEwKSArIDEwMDtpZihpc19mb3JtKXtqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykuaHRtbChmb3JtX2NvbnRlbnQuaHRtbCgpKTtpZihmb3JtX2NvbnRlbnQuaGFzQ2xhc3MoJ2dmb3JtX3ZhbGlkYXRpb25fZXJyb3InKSl7alF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLmFkZENsYXNzKCdnZm9ybV92YWxpZGF0aW9uX2Vycm9yJyk7fSBlbHNlIHtqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykucmVtb3ZlQ2xhc3MoJ2dmb3JtX3ZhbGlkYXRpb25fZXJyb3InKTt9c2V0VGltZW91dCggZnVuY3Rpb24oKSB7IC8qIGRlbGF5IHRoZSBzY3JvbGwgYnkgNTAgbWlsbGlzZWNvbmRzIHRvIGZpeCBhIGJ1ZyBpbiBjaHJvbWUgKi8galF1ZXJ5KGRvY3VtZW50KS5zY3JvbGxUb3AoalF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLm9mZnNldCgpLnRvcCAtIG10KTsgfSwgNTAgKTtpZih3aW5kb3dbJ2dmb3JtSW5pdERhdGVwaWNrZXInXSkge2dmb3JtSW5pdERhdGVwaWNrZXIoKTt9aWYod2luZG93WydnZm9ybUluaXRQcmljZUZpZWxkcyddKSB7Z2Zvcm1Jbml0UHJpY2VGaWVsZHMoKTt9dmFyIGN1cnJlbnRfcGFnZSA9IGpRdWVyeSgnI2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScpLnZhbCgpO2dmb3JtSW5pdFNwaW5uZXIoIDExLCAnaHR0cHM6Ly9wYWNpZmljcGVyaW8uY29tLmF1L3dwLWNvbnRlbnQvcGx1Z2lucy9ncmF2aXR5Zm9ybXMvaW1hZ2VzL3NwaW5uZXIuc3ZnJywgdHJ1ZSApO2pRdWVyeShkb2N1bWVudCkudHJpZ2dlcignZ2Zvcm1fcGFnZV9sb2FkZWQnLCBbMTEsIGN1cnJlbnRfcGFnZV0pO3dpbmRvd1snZ2Zfc3VibWl0dGluZ18xMSddID0gZmFsc2U7fWVsc2UgaWYoIWlzX3JlZGlyZWN0KXt2YXIgY29uZmlybWF0aW9uX2NvbnRlbnQgPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcuR0ZfQUpBWF9QT1NUQkFDSycpLmh0bWwoKTtpZighY29uZmlybWF0aW9uX2NvbnRlbnQpe2NvbmZpcm1hdGlvbl9jb250ZW50ID0gY29udGVudHM7fWpRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5yZXBsYWNlV2l0aChjb25maXJtYXRpb25fY29udGVudCk7alF1ZXJ5KGRvY3VtZW50KS5zY3JvbGxUb3AoalF1ZXJ5KCcjZ2ZfMTEnKS5vZmZzZXQoKS50b3AgLSBtdCk7alF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKCdnZm9ybV9jb25maXJtYXRpb25fbG9hZGVkJywgWzExXSk7d2luZG93WydnZl9zdWJtaXR0aW5nXzExJ10gPSBmYWxzZTt3cC5hMTF5LnNwZWFrKGpRdWVyeSgnI2dmb3JtX2NvbmZpcm1hdGlvbl9tZXNzYWdlXzExJykudGV4dCgpKTt9ZWxzZXtqUXVlcnkoJyNnZm9ybV8xMScpLmFwcGVuZChjb250ZW50cyk7aWYod2luZG93WydnZm9ybVJlZGlyZWN0J10pIHtnZm9ybVJlZGlyZWN0KCk7fX1qUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXIoImdmb3JtX3ByZV9wb3N0X3JlbmRlciIsIFt7IGZvcm1JZDogIjExIiwgY3VycmVudFBhZ2U6ICJjdXJyZW50X3BhZ2UiLCBhYm9ydDogZnVuY3Rpb24oKSB7IHRoaXMucHJldmVudERlZmF1bHQoKTsgfSB9XSk7ICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgeyAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICB9ICAgICAgICBjb25zdCBnZm9ybVdyYXBwZXJEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggImdmb3JtX3dyYXBwZXJfMTEiICk7ICAgICAgICBpZiAoIGdmb3JtV3JhcHBlckRpdiApIHsgICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFuIiApOyAgICAgICAgICAgIHZpc2liaWxpdHlTcGFuLmlkID0gImdmb3JtX3Zpc2liaWxpdHlfdGVzdF8xMSI7ICAgICAgICAgICAgZ2Zvcm1XcmFwcGVyRGl2Lmluc2VydEFkamFjZW50RWxlbWVudCggImFmdGVyZW5kIiwgdmlzaWJpbGl0eVNwYW4gKTsgICAgICAgIH0gICAgICAgIGNvbnN0IHZpc2liaWxpdHlUZXN0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJnZm9ybV92aXNpYmlsaXR5X3Rlc3RfMTEiICk7ICAgICAgICBsZXQgcG9zdFJlbmRlckZpcmVkID0gZmFsc2U7ICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUG9zdFJlbmRlcigpIHsgICAgICAgICAgICBpZiAoIHBvc3RSZW5kZXJGaXJlZCApIHsgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgIH0gICAgICAgICAgICBwb3N0UmVuZGVyRmlyZWQgPSB0cnVlOyAgICAgICAgICAgIGdmb3JtLmNvcmUudHJpZ2dlclBvc3RSZW5kZXJFdmVudHMoIDExLCBjdXJyZW50X3BhZ2UgKTsgICAgICAgICAgICBpZiAoIHZpc2liaWxpdHlUZXN0RGl2ICkgeyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5VGVzdERpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB2aXNpYmlsaXR5VGVzdERpdiApOyAgICAgICAgICAgIH0gICAgICAgIH0gICAgICAgIGZ1bmN0aW9uIGRlYm91bmNlKCBmdW5jLCB3YWl0LCBpbW1lZGlhdGUgKSB7ICAgICAgICAgICAgdmFyIHRpbWVvdXQ7ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7ICAgICAgICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICBpZiAoICFpbW1lZGlhdGUgKSBmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7ICAgICAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0OyAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXQgKTsgICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoIGxhdGVyLCB3YWl0ICk7ICAgICAgICAgICAgICAgIGlmICggY2FsbE5vdyApIGZ1bmMuYXBwbHkoIGNvbnRleHQsIGFyZ3MgKTsgICAgICAgICAgICB9OyAgICAgICAgfSAgICAgICAgY29uc3QgZGVib3VuY2VkVHJpZ2dlclBvc3RSZW5kZXIgPSBkZWJvdW5jZSggZnVuY3Rpb24oKSB7ICAgICAgICAgICAgdHJpZ2dlclBvc3RSZW5kZXIoKTsgICAgICAgIH0sIDIwMCApOyAgICAgICAgaWYgKCB2aXNpYmlsaXR5VGVzdERpdiAmJiB2aXNpYmlsaXR5VGVzdERpdi5vZmZzZXRQYXJlbnQgPT09IG51bGwgKSB7ICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlciggKCBtdXRhdGlvbnMgKSA9PiB7ICAgICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCAoIG11dGF0aW9uICkgPT4geyAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgdmlzaWJpbGl0eVRlc3REaXYub2Zmc2V0UGFyZW50ICE9PSBudWxsICkgeyAgICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlZFRyaWdnZXJQb3N0UmVuZGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICB9KTsgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKCBkb2N1bWVudC5ib2R5LCB7ICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogZmFsc2UsICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWyAnc3R5bGUnLCAnY2xhc3MnIF0sICAgICAgICAgICAgfSk7ICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIHRyaWdnZXJQb3N0UmVuZGVyKCk7ICAgICAgICB9ICAgIH0gKTt9ICk7IAovKiBdXT4gKi8KPC9zY3JpcHQ+Cg==