{"id":24800,"date":"2026-09-02T06:18:12","date_gmt":"2026-09-02T06:18:12","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24800"},"modified":"2026-09-02T06:18:15","modified_gmt":"2026-09-02T06:18:15","slug":"compressive-strength-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/compressive-strength-calculator\/","title":{"rendered":"Compressive Strength Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Compressive Strength Calculator<\/strong> is a practical engineering tool designed to calculate compressive stress, allowable compressive load, required cross-sectional area, safety factor, and compression utilization for components under axial loading. It helps engineers evaluate columns, rods, blocks, tubes, and structural members while identifying whether material strength or buckling may govern the design. The Compressive Strength Calculator is useful for mechanical design, structural analysis, material selection, and preliminary safety verification.<\/p>\n\n\n\n<!-- Compressive Strength Calculator - WordPress Embed -->\n<!-- Paste into Custom HTML block. All CSS\/JS scoped to #csc-calculator \u2014 will not affect other page content. -->\n<style>\n\/**\n * Compressive Strength Calculator \u2014 WordPress-safe scoped styles\n * Every rule is scoped under #csc-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n.entry-content #csc-calculator.csc-root,\n.wp-block-html #csc-calculator.csc-root,\n.elementor-widget-container #csc-calculator.csc-root,\n#csc-calculator.csc-root,\n.entry-content #csc-calculator.csc-root *,\n.wp-block-html #csc-calculator.csc-root *,\n.elementor-widget-container #csc-calculator.csc-root *,\n#csc-calculator.csc-root *,\n.entry-content #csc-calculator.csc-root *::before,\n.wp-block-html #csc-calculator.csc-root *::before,\n.elementor-widget-container #csc-calculator.csc-root *::before,\n#csc-calculator.csc-root *::before,\n.entry-content #csc-calculator.csc-root *::after,\n.wp-block-html #csc-calculator.csc-root *::after,\n.elementor-widget-container #csc-calculator.csc-root *::after,\n#csc-calculator.csc-root *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #csc-calculator.csc-root,\n.wp-block-html #csc-calculator.csc-root,\n.elementor-widget-container #csc-calculator.csc-root,\n#csc-calculator.csc-root {\n    --csc-primary: #1a5276;\n    --csc-primary-light: #2471a3;\n    --csc-primary-dark: #0e3d5c;\n    --csc-safe: #27ae60;\n    --csc-caution: #f39c12;\n    --csc-unsafe: #e74c3c;\n    --csc-bg: #ffffff;\n    --csc-card-bg: #ffffff;\n    --csc-text: #2c3e50;\n    --csc-text-muted: #7f8c8d;\n    --csc-border: #dce4ec;\n    --csc-shadow: 0 2px 8px rgba(26, 82, 118, 0.08);\n    --csc-radius: 8px;\n    --csc-radius-lg: 12px;\n    --csc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --csc-mono: Consolas, 'Courier New', monospace;\n\n    all: revert;\n    box-sizing: border-box !important;\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    font-family: var(--csc-font) !important;\n    font-size: 15px !important;\n    line-height: 1.6 !important;\n    color: var(--csc-text) !important;\n    background: transparent !important;\n    border: none !important;\n    border-radius: 0 !important;\n    padding: 0 !important;\n    margin: 0 auto !important;\n    text-align: left !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    float: none !important;\n    clear: both !important;\n    z-index: auto !important;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n.entry-content #csc-calculator.csc-root .csc-wrap,\n.wp-block-html #csc-calculator.csc-root .csc-wrap,\n.elementor-widget-container #csc-calculator.csc-root .csc-wrap,\n#csc-calculator.csc-root .csc-wrap {\n    background: var(--csc-bg) !important;\n    border-radius: var(--csc-radius-lg) !important;\n    padding: 8px !important;\n}\n\n#csc-calculator.csc-root [hidden] {\n    display: none !important;\n}\n\n#csc-calculator.csc-root h1,\n#csc-calculator.csc-root h2,\n#csc-calculator.csc-root h3,\n#csc-calculator.csc-root h4,\n#csc-calculator.csc-root p,\n#csc-calculator.csc-root ul,\n#csc-calculator.csc-root ol,\n#csc-calculator.csc-root li,\n#csc-calculator.csc-root section,\n#csc-calculator.csc-root div,\n#csc-calculator.csc-root span,\n#csc-calculator.csc-root strong,\n#csc-calculator.csc-root em {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    font-style: inherit !important;\n    line-height: inherit !important;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n    background: none !important;\n}\n\n#csc-calculator.csc-root button,\n#csc-calculator.csc-root input,\n#csc-calculator.csc-root select,\n#csc-calculator.csc-root label,\n#csc-calculator.csc-root legend {\n    font-family: var(--csc-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    box-shadow: none !important;\n}\n\n#csc-calculator.csc-root ul,\n#csc-calculator.csc-root ol {\n    list-style: none !important;\n}\n\n#csc-calculator.csc-root button {\n    cursor: pointer !important;\n    background: none !important;\n    border: none !important;\n    padding: 0 !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n}\n\n#csc-calculator.csc-root svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n    float: none !important;\n}\n\n#csc-calculator.csc-root *,\n#csc-calculator.csc-root *::before,\n#csc-calculator.csc-root *::after {\n    box-sizing: border-box !important;\n}\n\n#csc-calculator.csc-root h1,\n#csc-calculator.csc-root h2,\n#csc-calculator.csc-root h3,\n#csc-calculator.csc-root h4,\n#csc-calculator.csc-root p,\n#csc-calculator.csc-root ul,\n#csc-calculator.csc-root li,\n#csc-calculator.csc-root label {\n    font-family: inherit !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n}\n\n#csc-calculator.csc-root h1,\n#csc-calculator.csc-root h2,\n#csc-calculator.csc-root h3,\n#csc-calculator.csc-root h4,\n#csc-calculator.csc-root p,\n#csc-calculator.csc-root ul,\n#csc-calculator.csc-root li {\n    margin: 0 !important;\n    padding: 0 !important;\n    line-height: inherit !important;\n}\n\n#csc-calculator.csc-root .csc-wrap {\n    max-width: 1100px !important;\n    margin: 0 auto !important;\n    padding: 12px 8px !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 24px !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-input,\n#csc-calculator.csc-root .csc-output {\n    width: 100% !important;\n    display: block !important;\n    float: none !important;\n}\n\n#csc-calculator.csc-root .csc-card {\n    display: block !important;\n    background: var(--csc-card-bg) !important;\n    border-radius: var(--csc-radius-lg) !important;\n    padding: 20px 24px !important;\n    box-shadow: var(--csc-shadow) !important;\n    border: 1px solid var(--csc-border) !important;\n    width: 100% !important;\n    margin: 0 !important;\n}\n\n#csc-calculator.csc-root .csc-card > h2 {\n    font-size: 1.1rem !important;\n    color: var(--csc-primary) !important;\n    margin: 0 0 16px !important;\n    padding: 0 0 8px !important;\n    border: none !important;\n    border-bottom: 2px solid var(--csc-border) !important;\n    background: none !important;\n}\n\n#csc-calculator.csc-root .csc-section + .csc-section {\n    margin-top: 24px !important;\n    padding-top: 20px !important;\n    border-top: 1px solid var(--csc-border) !important;\n}\n\n#csc-calculator.csc-root .csc-section-title {\n    font-size: 1.05rem !important;\n    color: var(--csc-primary) !important;\n    margin: 0 0 14px !important;\n    padding: 0 0 6px !important;\n    border: none !important;\n    border-bottom: 2px solid var(--csc-border) !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 8px !important;\n    font-weight: 600 !important;\n    background: none !important;\n}\n\n#csc-calculator.csc-root .csc-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 14px !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-field {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 4px !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    width: 100% !important;\n    min-width: 0 !important;\n}\n\n#csc-calculator.csc-root .csc-field.csc-span-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n#csc-calculator.csc-root .csc-field > label {\n    font-size: 0.82rem !important;\n    font-weight: 600 !important;\n    color: var(--csc-text) !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 4px !important;\n    margin: 0 0 4px !important;\n    padding: 0 !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-field label input[type=\"checkbox\"] {\n    width: auto !important;\n    min-height: 0 !important;\n    margin: 0 6px 0 0 !important;\n    accent-color: var(--csc-primary);\n}\n\n#csc-calculator.csc-root .csc-field input,\n#csc-calculator.csc-root .csc-field select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    margin: 0 !important;\n    padding: 9px 12px !important;\n    border: 1px solid var(--csc-border) !important;\n    border-radius: var(--csc-radius) !important;\n    font-size: 0.95rem !important;\n    font-family: var(--csc-font) !important;\n    background: #fafbfc !important;\n    color: var(--csc-text) !important;\n    line-height: 1.4 !important;\n    height: auto !important;\n    min-height: 38px !important;\n    box-shadow: none !important;\n    outline: none !important;\n    -webkit-appearance: none !important;\n    appearance: none !important;\n}\n\n#csc-calculator.csc-root .csc-field select {\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%232c3e50' d='M1 1l5 5 5-5'\/%3E%3C\/svg%3E\") !important;\n    background-repeat: no-repeat !important;\n    background-position: right 12px center !important;\n    padding-right: 32px !important;\n}\n\n#csc-calculator.csc-root .csc-field input:focus,\n#csc-calculator.csc-root .csc-field select:focus {\n    border-color: var(--csc-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n    background-color: #fff !important;\n}\n\n#csc-calculator.csc-root .csc-field input::placeholder {\n    color: #b0bec5 !important;\n    opacity: 1 !important;\n}\n\n#csc-calculator.csc-root .csc-hidden {\n    display: none !important;\n}\n\n#csc-calculator.csc-root .csc-tip {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 16px !important;\n    height: 16px !important;\n    border-radius: 50% !important;\n    background: var(--csc-primary-light) !important;\n    color: #fff !important;\n    font-size: 0.65rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    flex-shrink: 0 !important;\n    line-height: 1 !important;\n}\n\n#csc-calculator.csc-root .csc-tip::after {\n    content: attr(data-tip);\n    position: absolute;\n    bottom: calc(100% + 6px);\n    left: 50%;\n    transform: translateX(-50%);\n    background: var(--csc-primary-dark);\n    color: #fff;\n    padding: 6px 10px;\n    border-radius: 6px;\n    font-size: 0.75rem;\n    font-weight: 400;\n    white-space: normal;\n    width: max-content;\n    max-width: 240px;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 0.2s;\n    z-index: 100;\n    line-height: 1.4;\n}\n\n#csc-calculator.csc-root .csc-tip:hover::after {\n    opacity: 1;\n}\n\n#csc-calculator.csc-root .csc-actions {\n    display: flex !important;\n    justify-content: center !important;\n    align-items: center !important;\n    flex-wrap: wrap !important;\n    gap: 12px !important;\n    margin-top: 24px !important;\n    padding-top: 20px !important;\n    border-top: 1px solid var(--csc-border) !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-btn {\n    display: inline-block !important;\n    width: auto !important;\n    max-width: none !important;\n    padding: 10px 32px !important;\n    min-width: 140px !important;\n    border: none !important;\n    border-radius: var(--csc-radius) !important;\n    font-size: 1rem !important;\n    font-weight: 600 !important;\n    cursor: pointer !important;\n    font-family: var(--csc-font) !important;\n    line-height: 1.4 !important;\n    text-align: center !important;\n    text-decoration: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    transition: transform 0.15s, box-shadow 0.15s, background 0.2s;\n}\n\n#csc-calculator.csc-root .csc-btn-primary {\n    background: linear-gradient(135deg, var(--csc-primary) 0%, var(--csc-primary-light) 100%) !important;\n    color: #fff !important;\n    box-shadow: 0 3px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#csc-calculator.csc-root .csc-btn-primary:hover {\n    background: linear-gradient(135deg, var(--csc-primary-light) 0%, var(--csc-primary) 100%) !important;\n    color: #fff !important;\n    transform: translateY(-1px);\n}\n\n#csc-calculator.csc-root .csc-btn-secondary {\n    background: #ecf0f1 !important;\n    color: var(--csc-text) !important;\n    border: 1px solid var(--csc-border) !important;\n}\n\n#csc-calculator.csc-root .csc-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#csc-calculator.csc-root .csc-viz-row {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 16px !important;\n    margin-bottom: 20px !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-viz-card {\n    background: #fafbfc !important;\n    border: 1px solid var(--csc-border) !important;\n    border-radius: var(--csc-radius) !important;\n    padding: 14px !important;\n}\n\n#csc-calculator.csc-root .csc-viz-card h4 {\n    font-size: 0.85rem !important;\n    color: var(--csc-primary) !important;\n    margin: 0 0 10px !important;\n    font-weight: 600 !important;\n}\n\n#csc-calculator.csc-root .csc-illustration {\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    min-height: 120px !important;\n}\n\n#csc-calculator.csc-root .csc-illustration svg {\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#csc-calculator.csc-root .csc-util-bar-wrap {\n    display: flex !important;\n    align-items: center !important;\n    gap: 12px !important;\n}\n\n#csc-calculator.csc-root .csc-util-bar {\n    flex: 1 !important;\n    height: 22px !important;\n    background: #ecf0f1 !important;\n    border-radius: 11px !important;\n    overflow: hidden !important;\n    position: relative !important;\n}\n\n#csc-calculator.csc-root .csc-util-fill {\n    height: 100% !important;\n    width: 0 !important;\n    background: var(--csc-safe) !important;\n    border-radius: 11px !important;\n    transition: width 0.4s ease, background 0.3s !important;\n}\n\n#csc-calculator.csc-root .csc-util-fill.csc-caution {\n    background: var(--csc-caution) !important;\n}\n\n#csc-calculator.csc-root .csc-util-fill.csc-unsafe {\n    background: var(--csc-unsafe) !important;\n}\n\n#csc-calculator.csc-root .csc-util-text {\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n    font-family: var(--csc-mono) !important;\n    min-width: 52px !important;\n    text-align: right !important;\n}\n\n#csc-calculator.csc-root .csc-util-zones {\n    display: flex !important;\n    justify-content: space-between !important;\n    margin-top: 8px !important;\n    font-size: 0.68rem !important;\n    color: var(--csc-text-muted) !important;\n}\n\n#csc-calculator.csc-root .csc-zone-safe { color: var(--csc-safe) !important; }\n#csc-calculator.csc-root .csc-zone-caution { color: var(--csc-caution) !important; }\n#csc-calculator.csc-root .csc-zone-unsafe { color: var(--csc-unsafe) !important; }\n\n#csc-calculator.csc-root .csc-status-banner {\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    gap: 10px !important;\n    padding: 14px 20px !important;\n    border-radius: var(--csc-radius) !important;\n    margin-bottom: 20px !important;\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n}\n\n#csc-calculator.csc-root .csc-status-banner.csc-safe {\n    background: #d5f5e3 !important;\n    color: #1e8449 !important;\n    border: 1px solid var(--csc-safe) !important;\n}\n\n#csc-calculator.csc-root .csc-status-banner.csc-caution {\n    background: #fdebd0 !important;\n    color: #9a7d0a !important;\n    border: 1px solid var(--csc-caution) !important;\n}\n\n#csc-calculator.csc-root .csc-status-banner.csc-unsafe {\n    background: #fadbd8 !important;\n    color: #922b21 !important;\n    border: 1px solid var(--csc-unsafe) !important;\n}\n\n#csc-calculator.csc-root .csc-status-icon {\n    font-size: 1.4rem !important;\n}\n\n#csc-calculator.csc-root .csc-results-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 10px !important;\n    width: 100% !important;\n}\n\n#csc-calculator.csc-root .csc-result {\n    display: flex !important;\n    flex-direction: column !important;\n    padding: 10px 14px !important;\n    background: #fafbfc !important;\n    border-radius: var(--csc-radius) !important;\n    border: 1px solid var(--csc-border) !important;\n}\n\n#csc-calculator.csc-root .csc-result.csc-result-hi {\n    grid-column: 1 \/ -1 !important;\n    background: linear-gradient(135deg, #eaf2f8 0%, #d4e6f1 100%) !important;\n    border-color: var(--csc-primary-light) !important;\n}\n\n#csc-calculator.csc-root .csc-result-label {\n    font-size: 0.75rem !important;\n    color: var(--csc-text-muted) !important;\n    font-weight: 500 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n}\n\n#csc-calculator.csc-root .csc-result-value {\n    font-size: 1.05rem !important;\n    font-weight: 700 !important;\n    color: var(--csc-primary-dark) !important;\n    font-family: var(--csc-mono) !important;\n    margin-top: 2px !important;\n}\n\n#csc-calculator.csc-root .csc-result-value.csc-safe { color: var(--csc-safe) !important; }\n#csc-calculator.csc-root .csc-result-value.csc-caution { color: var(--csc-caution) !important; }\n#csc-calculator.csc-root .csc-result-value.csc-unsafe { color: var(--csc-unsafe) !important; }\n\n#csc-calculator.csc-root .csc-warnings {\n    margin-bottom: 14px !important;\n}\n\n#csc-calculator.csc-root .csc-warning {\n    padding: 10px 14px !important;\n    border-radius: var(--csc-radius) !important;\n    margin-bottom: 8px !important;\n    font-size: 0.88rem !important;\n    display: flex !important;\n    align-items: flex-start !important;\n    gap: 8px !important;\n}\n\n#csc-calculator.csc-root .csc-warning-error {\n    background: #fadbd8 !important;\n    color: #922b21 !important;\n    border-left: 4px solid var(--csc-unsafe) !important;\n}\n\n#csc-calculator.csc-root .csc-warning-warn {\n    background: #fdebd0 !important;\n    color: #7d6608 !important;\n    border-left: 4px solid var(--csc-caution) !important;\n}\n\n#csc-calculator.csc-root .csc-warning-info {\n    background: #d6eaf8 !important;\n    color: #1a5276 !important;\n    border-left: 4px solid var(--csc-primary-light) !important;\n}\n\n#csc-calculator.csc-root .csc-recommendations {\n    margin-top: 20px !important;\n    padding: 16px !important;\n    background: #f8f9fa !important;\n    border-radius: var(--csc-radius) !important;\n    border: 1px solid var(--csc-border) !important;\n}\n\n#csc-calculator.csc-root .csc-recommendations h4 {\n    font-size: 0.9rem !important;\n    color: var(--csc-primary) !important;\n    margin: 0 0 10px !important;\n    font-weight: 600 !important;\n}\n\n#csc-calculator.csc-root .csc-recommendations ul {\n    list-style: disc !important;\n    padding-left: 20px !important;\n}\n\n#csc-calculator.csc-root .csc-recommendations li {\n    font-size: 0.88rem !important;\n    color: var(--csc-text) !important;\n    margin-bottom: 6px !important;\n    line-height: 1.5 !important;\n}\n\n@media (max-width: 768px) {\n    #csc-calculator.csc-root .csc-grid,\n    #csc-calculator.csc-root .csc-results-grid,\n    #csc-calculator.csc-root .csc-viz-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #csc-calculator.csc-root .csc-card {\n        padding: 16px !important;\n    }\n}\n\n@media (max-width: 480px) {\n    #csc-calculator.csc-root .csc-btn {\n        width: 100% !important;\n    }\n}\n\n<\/style>\n\n<div id=\"csc-calculator\" class=\"csc-root\">\n    <div class=\"csc-wrap\">\n        <div class=\"csc-layout\">\n            <div class=\"csc-input\">\n                <section class=\"csc-card csc-inputs\">\n                    <div class=\"csc-section\">\n                        <h3 class=\"csc-section-title\">General Settings<\/h3>\n                        <div class=\"csc-grid\">\n                            <div class=\"csc-field\">\n                                <label for=\"csc-unitSystem\">Unit System<\/label>\n                                <select id=\"csc-unitSystem\">\n                                    <option value=\"metric\">Metric (MPa, kN, mm)<\/option>\n                                    <option value=\"imperial\">Imperial (ksi, lbf, in)<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-calcMode\">Calculation Mode\n                                    <span class=\"csc-tip\" data-tip=\"Select what you want to calculate\">?<\/span>\n                                <\/label>\n                                <select id=\"csc-calcMode\">\n                                    <option value=\"stressCheck\" selected>Compressive Stress Check<\/option>\n                                    <option value=\"maxLoad\">Maximum Compressive Load<\/option>\n                                    <option value=\"allowableLoad\">Allowable Compressive Load<\/option>\n                                    <option value=\"requiredArea\">Required Area Calculation<\/option>\n                                    <option value=\"requiredDiameter\">Required Diameter Calculation<\/option>\n                                    <option value=\"safetyFactor\">Factor of Safety Calculation<\/option>\n                                    <option value=\"bucklingCheck\">Column Buckling Check<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-componentType\">Component Type\n                                    <span class=\"csc-tip\" data-tip=\"Type of component being evaluated\">?<\/span>\n                                <\/label>\n                                <select id=\"csc-componentType\">\n                                    <option value=\"column\" selected>Column<\/option>\n                                    <option value=\"rod\">Rod<\/option>\n                                    <option value=\"tube\">Tube<\/option>\n                                    <option value=\"block\">Block<\/option>\n                                    <option value=\"plate\">Plate<\/option>\n                                    <option value=\"bar\">Bar<\/option>\n                                    <option value=\"custom\">Custom<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-section\" id=\"csc-geometrySection\">\n                        <h3 class=\"csc-section-title\">Cross-Section Geometry<\/h3>\n                        <div class=\"csc-grid\">\n                            <div class=\"csc-field csc-span-full\">\n                                <label for=\"csc-sectionType\">Cross-Section Type<\/label>\n                                <select id=\"csc-sectionType\">\n                                    <option value=\"solid_round\" selected>Solid Round<\/option>\n                                    <option value=\"hollow_round\">Hollow Round<\/option>\n                                    <option value=\"rectangle\">Rectangle<\/option>\n                                    <option value=\"square\">Square<\/option>\n                                    <option value=\"custom\">Custom Area<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field\" data-sections=\"solid_round\">\n                                <label for=\"csc-diameter\">Diameter (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-diameter\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"hollow_round\">\n                                <label for=\"csc-outerDiameter\">Outer Diameter (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-outerDiameter\" value=\"40\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"hollow_round\">\n                                <label for=\"csc-innerDiameter\">Inner Diameter (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-innerDiameter\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"rectangle\">\n                                <label for=\"csc-width\">Width (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-width\" value=\"50\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"rectangle\">\n                                <label for=\"csc-thickness\">Thickness \/ Height (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-thickness\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"square\">\n                                <label for=\"csc-squareSide\">Square Side (<span class=\"csc-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-squareSide\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-geom-field csc-hidden\" data-sections=\"custom\">\n                                <label for=\"csc-customArea\">Custom Cross-Sectional Area (<span class=\"csc-u-area\">mm\u00b2<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-customArea\" value=\"706.86\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-netAreaReduction\">Net Area Reduction (%)\n                                    <span class=\"csc-tip\" data-tip=\"Reduction for holes, slots, grooves, machined recesses\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-netAreaReduction\" value=\"0\" min=\"0\" max=\"99\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-section\">\n                        <h3 class=\"csc-section-title\">Material Properties<\/h3>\n                        <div class=\"csc-grid\">\n                            <div class=\"csc-field csc-span-full\">\n                                <label for=\"csc-material\">Material Preset<\/label>\n                                <select id=\"csc-material\">\n                                    <option value=\"structural_steel\" selected>Structural Steel<\/option>\n                                    <option value=\"carbon_steel\">Carbon Steel<\/option>\n                                    <option value=\"alloy_steel\">Alloy Steel<\/option>\n                                    <option value=\"stainless_steel\">Stainless Steel<\/option>\n                                    <option value=\"aluminum\">Aluminum Alloy<\/option>\n                                    <option value=\"cast_iron\">Cast Iron<\/option>\n                                    <option value=\"concrete\">Concrete<\/option>\n                                    <option value=\"timber\">Timber<\/option>\n                                    <option value=\"plastic\">Engineering Plastic<\/option>\n                                    <option value=\"custom\">Custom Material<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-compressiveStrength\">Compressive Strength (<span class=\"csc-u-stress\">MPa<\/span>)\n                                    <span class=\"csc-tip\" data-tip=\"Material compressive strength Sc used for capacity calculations\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-compressiveStrength\" value=\"355\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-yieldStrength\">Yield Strength (<span class=\"csc-u-stress\">MPa<\/span>)\n                                    <span class=\"csc-tip\" data-tip=\"Optional for ductile materials. Used for yield-based compression check.\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-yieldStrength\" value=\"355\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-youngsModulus\">Young&#8217;s Modulus (<span class=\"csc-u-modulus\">GPa<\/span>)\n                                    <span class=\"csc-tip\" data-tip=\"Required for Euler buckling calculations\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-youngsModulus\" value=\"200\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label for=\"csc-safetyFactor\">Design Safety Factor (SF)\n                                    <span class=\"csc-tip\" data-tip=\"\u03c3allow = Sc \/ SF. Default: 2.0\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-safetyFactor\" value=\"2.0\" min=\"0.01\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field\" id=\"csc-bucklingSfGroup\">\n                                <label for=\"csc-bucklingSafetyFactor\">Buckling Safety Factor (SFb)\n                                    <span class=\"csc-tip\" data-tip=\"Fallow,buckling = Pcr \/ SFb. Default: same as design SF\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-bucklingSafetyFactor\" value=\"\" min=\"0.01\" step=\"any\" placeholder=\"Same as SF\">\n                            <\/div>\n                            <div class=\"csc-field\">\n                                <label>\n                                    <input type=\"checkbox\" id=\"csc-useYieldCheck\"> Enable Yield-Based Compression Check\n                                    <span class=\"csc-tip\" data-tip=\"For ductile materials: \u03c3allow,y = Sy \/ SF. Governing value is the lower allowable.\">?<\/span>\n                                <\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-section\" id=\"csc-loadSection\">\n                        <h3 class=\"csc-section-title\">Applied Loading<\/h3>\n                        <div class=\"csc-grid\">\n                            <div class=\"csc-field csc-load-field\" data-modes=\"stressCheck,maxLoad,allowableLoad,requiredArea,requiredDiameter,safetyFactor,bucklingCheck\">\n                                <label for=\"csc-appliedLoad\">Applied Compressive Load (<span class=\"csc-u-force\">kN<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-appliedLoad\" value=\"100\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-load-field\" data-modes=\"stressCheck,safetyFactor,bucklingCheck\">\n                                <label for=\"csc-stressConcentration\">Stress Concentration Factor (Kt)\n                                    <span class=\"csc-tip\" data-tip=\"\u03c3local = Kt \u00d7 \u03c3nominal. Default: 1.0\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-stressConcentration\" value=\"1.0\" min=\"1\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-section\" id=\"csc-bucklingSection\">\n                        <h3 class=\"csc-section-title\">Column Buckling Parameters<\/h3>\n                        <div class=\"csc-grid\">\n                            <div class=\"csc-field\">\n                                <label>\n                                    <input type=\"checkbox\" id=\"csc-enableBuckling\" checked> Enable Buckling Check\n                                <\/label>\n                            <\/div>\n                            <div class=\"csc-field csc-buckling-field\">\n                                <label for=\"csc-columnLength\">Column Length (<span class=\"csc-u-colLength\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"csc-columnLength\" value=\"1000\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-buckling-field\">\n                                <label for=\"csc-endCondition\">End Condition Preset\n                                    <span class=\"csc-tip\" data-tip=\"Idealized effective length factors. Actual conditions may require code-specific values.\">?<\/span>\n                                <\/label>\n                                <select id=\"csc-endCondition\">\n                                    <option value=\"1.0\" selected>Pinned-Pinned (K = 1.0)<\/option>\n                                    <option value=\"0.5\">Fixed-Fixed (K = 0.5)<\/option>\n                                    <option value=\"0.7\">Fixed-Pinned (K = 0.7)<\/option>\n                                    <option value=\"2.0\">Fixed-Free (K = 2.0)<\/option>\n                                    <option value=\"custom\">Custom K Value<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"csc-field csc-buckling-field csc-hidden\" id=\"csc-customKGroup\">\n                                <label for=\"csc-effectiveLengthFactor\">Effective Length Factor K<\/label>\n                                <input type=\"number\" id=\"csc-effectiveLengthFactor\" value=\"1.0\" min=\"0.01\" step=\"any\">\n                            <\/div>\n                            <div class=\"csc-field csc-buckling-field\">\n                                <label for=\"csc-momentOfInertia\">Second Moment of Area I (<span class=\"csc-u-inertia\">mm\u2074<\/span>)\n                                    <span class=\"csc-tip\" data-tip=\"Auto-calculated from geometry. Enter manually to override.\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"csc-momentOfInertia\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Auto-calculated\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-actions\">\n                        <button type=\"button\" id=\"csc-calculateBtn\" class=\"csc-btn csc-btn-primary\">Calculate<\/button>\n                    <\/div>\n                <\/section>\n            <\/div>\n\n            <div class=\"csc-output csc-hidden\" id=\"csc-resultsPanel\">\n                <section class=\"csc-card csc-results\">\n                    <div id=\"csc-statusBanner\" class=\"csc-status-banner csc-safe\">\n                        <span class=\"csc-status-icon\">\u2713<\/span>\n                        <span id=\"csc-statusText\">Safe<\/span>\n                    <\/div>\n\n                    <div id=\"csc-warnings\" class=\"csc-warnings\" hidden><\/div>\n\n                    <div class=\"csc-viz-row\">\n                        <div class=\"csc-viz-card\">\n                            <h4>Compression \/ Buckling Illustration<\/h4>\n                            <div class=\"csc-illustration\" id=\"csc-compressionViz\"><\/div>\n                        <\/div>\n                        <div class=\"csc-viz-card\">\n                            <h4>Cross-Section<\/h4>\n                            <div class=\"csc-illustration\" id=\"csc-sectionViz\"><\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"csc-viz-row\">\n                        <div class=\"csc-viz-card\">\n                            <h4>Compression Utilization<\/h4>\n                            <div class=\"csc-util-bar-wrap\">\n                                <div class=\"csc-util-bar\"><div class=\"csc-util-fill\" id=\"csc-compUtilFill\"><\/div><\/div>\n                                <span class=\"csc-util-text\" id=\"csc-compUtilText\">0%<\/span>\n                            <\/div>\n                            <div class=\"csc-util-zones\">\n                                <span class=\"csc-zone-safe\">Safe &lt;80%<\/span>\n                                <span class=\"csc-zone-caution\">Caution 80\u2013100%<\/span>\n                                <span class=\"csc-zone-unsafe\">Unsafe &gt;100%<\/span>\n                            <\/div>\n                        <\/div>\n                        <div class=\"csc-viz-card\" id=\"csc-bucklingUtilCard\">\n                            <h4>Buckling Utilization<\/h4>\n                            <div class=\"csc-util-bar-wrap\">\n                                <div class=\"csc-util-bar\"><div class=\"csc-util-fill\" id=\"csc-buckUtilFill\"><\/div><\/div>\n                                <span class=\"csc-util-text\" id=\"csc-buckUtilText\">\u2014<\/span>\n                            <\/div>\n                            <div class=\"csc-util-zones\">\n                                <span class=\"csc-zone-safe\">Safe &lt;80%<\/span>\n                                <span class=\"csc-zone-caution\">Caution 80\u2013100%<\/span>\n                                <span class=\"csc-zone-unsafe\">Unsafe &gt;100%<\/span>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <h2>Calculation Results<\/h2>\n                    <div class=\"csc-results-grid\" id=\"csc-resultsGrid\">\n                        <div class=\"csc-result\"><span class=\"csc-result-label\">Cross-Sectional Area<\/span><span class=\"csc-result-value\" id=\"csc-resArea\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\"><span class=\"csc-result-label\">Material Compressive Strength<\/span><span class=\"csc-result-value\" id=\"csc-resSc\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\"><span class=\"csc-result-label\">Allowable Compressive Stress<\/span><span class=\"csc-result-value\" id=\"csc-resAllowStress\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemAllowYield\"><span class=\"csc-result-label\">Allowable (Yield-Based)<\/span><span class=\"csc-result-value\" id=\"csc-resAllowYield\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemGoverningStress\"><span class=\"csc-result-label\">Governing Allowable Stress<\/span><span class=\"csc-result-value\" id=\"csc-resGoverningStress\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\" id=\"csc-resItemActualStress\"><span class=\"csc-result-label\">Actual Compressive Stress<\/span><span class=\"csc-result-value\" id=\"csc-resActualStress\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemLocalStress\"><span class=\"csc-result-label\">Local Stress (Kt)<\/span><span class=\"csc-result-value\" id=\"csc-resLocalStress\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\" id=\"csc-resItemMaxLoad\"><span class=\"csc-result-label\">Maximum Compressive Load<\/span><span class=\"csc-result-value\" id=\"csc-resMaxLoad\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\" id=\"csc-resItemAllowLoad\"><span class=\"csc-result-label\">Allowable Compressive Load<\/span><span class=\"csc-result-value\" id=\"csc-resAllowLoad\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemRequiredArea\"><span class=\"csc-result-label\">Required Cross-Sectional Area<\/span><span class=\"csc-result-value\" id=\"csc-resRequiredArea\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemRequiredDia\"><span class=\"csc-result-label\">Required Diameter<\/span><span class=\"csc-result-value\" id=\"csc-resRequiredDia\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\" id=\"csc-resItemActualSF\"><span class=\"csc-result-label\">Actual Safety Factor<\/span><span class=\"csc-result-value\" id=\"csc-resActualSF\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result\" id=\"csc-resItemUtilization\"><span class=\"csc-result-label\">Compression Utilization<\/span><span class=\"csc-result-value\" id=\"csc-resUtilization\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemStressReserve\"><span class=\"csc-result-label\">Stress Reserve<\/span><span class=\"csc-result-value\" id=\"csc-resStressReserve\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemLoadReserve\"><span class=\"csc-result-label\">Load Reserve<\/span><span class=\"csc-result-value\" id=\"csc-resLoadReserve\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemRadiusGyration\"><span class=\"csc-result-label\">Radius of Gyration<\/span><span class=\"csc-result-value\" id=\"csc-resRadiusGyration\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemSlenderness\"><span class=\"csc-result-label\">Slenderness Ratio (\u03bb)<\/span><span class=\"csc-result-value\" id=\"csc-resSlenderness\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemEulerLoad\"><span class=\"csc-result-label\">Euler Critical Load (Pcr)<\/span><span class=\"csc-result-value\" id=\"csc-resEulerLoad\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemBucklingAllow\"><span class=\"csc-result-label\">Buckling Allowable Load<\/span><span class=\"csc-result-value\" id=\"csc-resBucklingAllow\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemBucklingUtil\"><span class=\"csc-result-label\">Buckling Utilization<\/span><span class=\"csc-result-value\" id=\"csc-resBucklingUtil\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemGoverningCapacity\"><span class=\"csc-result-label\">Governing Capacity<\/span><span class=\"csc-result-value\" id=\"csc-resGoverningCapacity\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-hidden\" id=\"csc-resItemGoverningMode\"><span class=\"csc-result-label\">Governing Failure Mode<\/span><span class=\"csc-result-value\" id=\"csc-resGoverningMode\">&#8211;<\/span><\/div>\n                        <div class=\"csc-result csc-result-hi\"><span class=\"csc-result-label\">Design Status<\/span><span class=\"csc-result-value\" id=\"csc-resDesignStatus\">&#8211;<\/span><\/div>\n                    <\/div>\n\n                    <div class=\"csc-recommendations\" id=\"csc-recommendations\" hidden>\n                        <h4>Engineering Recommendations<\/h4>\n                        <ul id=\"csc-recommendationsList\"><\/ul>\n                    <\/div>\n                <\/section>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Option A: inline loader (no external files) -->\n<script type=\"text\/javascript\">\n(function(){\n  var b=\"LyoqDQogKiBDb21wcmVzc2l2ZSBTdHJlbmd0aCBDYWxjdWxhdG9yDQogKiBDb3JlIGNhbGN1bGF0aW9uIGVuZ2luZSwgVUkgbG9naWMsIGFuZCB2aXN1YWxpemF0aW9ucw0KICovDQoNCihmdW5jdGlvbiAoKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgY29uc3QgTUFURVJJQUxTID0gew0KICAgICAgICBzdHJ1Y3R1cmFsX3N0ZWVsOiB7IG5hbWU6ICdTdHJ1Y3R1cmFsIFN0ZWVsJywgc2M6IDM1NSwgc3k6IDM1NSwgRTogMjAwMDAwLCBkdWN0aWxlOiB0cnVlIH0sDQogICAgICAgIGNhcmJvbl9zdGVlbDogICAgIHsgbmFtZTogJ0NhcmJvbiBTdGVlbCcsICAgICBzYzogMjUwLCBzeTogMjUwLCBFOiAyMDAwMDAsIGR1Y3RpbGU6IHRydWUgfSwNCiAgICAgICAgYWxsb3lfc3RlZWw6ICAgICAgeyBuYW1lOiAnQWxsb3kgU3RlZWwnLCAgICAgIHNjOiA2OTAsIHN5OiA2OTAsIEU6IDIwNTAwMCwgZHVjdGlsZTogdHJ1ZSB9LA0KICAgICAgICBzdGFpbmxlc3Nfc3RlZWw6ICB7IG5hbWU6ICdTdGFpbmxlc3MgU3RlZWwnLCAgc2M6IDIwNSwgc3k6IDIwNSwgRTogMTkzMDAwLCBkdWN0aWxlOiB0cnVlIH0sDQogICAgICAgIGFsdW1pbnVtOiAgICAgICAgIHsgbmFtZTogJ0FsdW1pbnVtIEFsbG95JywgICBzYzogMjc1LCBzeTogMjc1LCBFOiA3MDAwMCwgIGR1Y3RpbGU6IHRydWUgfSwNCiAgICAgICAgY2FzdF9pcm9uOiAgICAgICAgeyBuYW1lOiAnQ2FzdCBJcm9uJywgICAgICAgIHNjOiA2NTAsIHN5OiAxMzAsIEU6IDExMDAwMCwgZHVjdGlsZTogZmFsc2UgfSwNCiAgICAgICAgY29uY3JldGU6ICAgICAgICAgeyBuYW1lOiAnQ29uY3JldGUnLCAgICAgICAgIHNjOiAzMCwgIHN5OiAwLCAgIEU6IDMwMDAwLCAgZHVjdGlsZTogZmFsc2UgfSwNCiAgICAgICAgdGltYmVyOiAgICAgICAgICAgeyBuYW1lOiAnVGltYmVyJywgICAgICAgICAgIHNjOiA0MCwgIHN5OiAwLCAgIEU6IDEyMDAwLCAgZHVjdGlsZTogZmFsc2UgfSwNCiAgICAgICAgcGxhc3RpYzogICAgICAgICAgeyBuYW1lOiAnRW5naW5lZXJpbmcgUGxhc3RpYycsIHNjOiA4MCwgc3k6IDUwLCBFOiAzMDAwLCBkdWN0aWxlOiB0cnVlIH0sDQogICAgICAgIGN1c3RvbTogICAgICAgICAgIHsgbmFtZTogJ0N1c3RvbSBNYXRlcmlhbCcsICBzYzogMCwgc3k6IDAsIEU6IDAsIGR1Y3RpbGU6IHRydWUgfQ0KICAgIH07DQoNCiAgICBjb25zdCBVTklUUyA9IHsNCiAgICAgICAgbWV0cmljOiB7DQogICAgICAgICAgICBzdHJlc3M6ICdNUGEnLCBmb3JjZTogJ2tOJywgbGVuZ3RoOiAnbW0nLCBhcmVhOiAnbW1cdTAwQjInLA0KICAgICAgICAgICAgbW9kdWx1czogJ0dQYScsIGNvbExlbmd0aDogJ21tJywgaW5lcnRpYTogJ21tXHUyMDc0JywNCiAgICAgICAgICAgIHN0cmVzc0Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0sDQogICAgICAgICAgICBzdHJlc3NUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgZm9yY2VGcm9tSW5w\"+\"dXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICogMTAwMDsgfSwNCiAgICAgICAgICAgIGZvcmNlVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDEwMDA7IH0sDQogICAgICAgICAgICBsZW5ndGhGcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgbGVuZ3RoVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfSwNCiAgICAgICAgICAgIGFyZWFGcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgYXJlYVRvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0sDQogICAgICAgICAgICBtb2R1bHVzRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDEwMDA7IH0sDQogICAgICAgICAgICBtb2R1bHVzVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDEwMDA7IH0sDQogICAgICAgICAgICBjb2xMZW5ndGhGcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgY29sTGVuZ3RoVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfSwNCiAgICAgICAgICAgIGluZXJ0aWFGcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgaW5lcnRpYVRvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0NCiAgICAgICAgfSwNCiAgICAgICAgaW1wZXJpYWw6IHsNCiAgICAgICAgICAgIHN0cmVzczogJ2tzaScsIGZvcmNlOiAnbGJmJywgbGVuZ3RoOiAnaW4nLCBhcmVhOiAnaW5cdTAwQjInLA0KICAgICAgICAgICAgbW9kdWx1czogJ2tzaScsIGNvbExlbmd0aDogJ2luJywgaW5lcnRpYTogJ2luXHUyMDc0JywNCiAgICAgICAgICAgIHN0cmVzc0Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiA2Ljg5NDc2OyB9LA0KICAgICAgICAgICAgc3RyZXNzVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDYuODk0NzY7IH0sDQogICAgICAgICAgICBmb3JjZUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiA0LjQ0ODIyOyB9LA0KICAgICAgICAgICAgZm9yY2VUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IC8gNC40NDgyMjsgfSwNCiAgICAgICAgICAgIGxlbmd0aEZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAyNS40OyB9LA0KICAgICAgICAgICAgbGVuZ3RoVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDI1LjQ7IH0sDQogICAgICAgICAgICBhcmVhRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDY0NS4xNjsgfSwNCiAgICAgICAgICAgIGFyZWFUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IC8gNjQ1LjE2OyB9LA0KICAgICAgICAgICAgbW9kdWx1c0Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiA2Ljg5NDc2OyB9LA0KICAgICAgICAgICAgbW9kdWx1c1RvRGlz\"+\"cGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyA2Ljg5NDc2OyB9LA0KICAgICAgICAgICAgY29sTGVuZ3RoRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDI1LjQ7IH0sDQogICAgICAgICAgICBjb2xMZW5ndGhUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgaW5lcnRpYUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiBNYXRoLnBvdygyNS40LCA0KTsgfSwNCiAgICAgICAgICAgIGluZXJ0aWFUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IC8gTWF0aC5wb3coMjUuNCwgNCk7IH0NCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICBsZXQgcm9vdCA9IG51bGw7DQogICAgY29uc3QgZWxzID0ge307DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290ID8gcm9vdC5xdWVyeVNlbGVjdG9yKCcjY3NjLScgKyBpZCkgOiBudWxsOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHFzYShzZWxlY3Rvcikgew0KICAgICAgICByZXR1cm4gcm9vdCA\/IHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikgOiBbXTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWNoZUVsZW1lbnRzKCkgew0KICAgICAgICBpZiAoIXJvb3QpIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3NjLWNhbGN1bGF0b3InKTsNCiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgY29uc3QgaWRzID0gWw0KICAgICAgICAgICAgJ3VuaXRTeXN0ZW0nLCAnY2FsY01vZGUnLCAnY29tcG9uZW50VHlwZScsICdzZWN0aW9uVHlwZScsDQogICAgICAgICAgICAnZGlhbWV0ZXInLCAnb3V0ZXJEaWFtZXRlcicsICdpbm5lckRpYW1ldGVyJywgJ3dpZHRoJywgJ3RoaWNrbmVzcycsDQogICAgICAgICAgICAnc3F1YXJlU2lkZScsICdjdXN0b21BcmVhJywgJ25ldEFyZWFSZWR1Y3Rpb24nLA0KICAgICAgICAgICAgJ21hdGVyaWFsJywgJ2NvbXByZXNzaXZlU3RyZW5ndGgnLCAneWllbGRTdHJlbmd0aCcsICd5b3VuZ3NNb2R1bHVzJywNCiAgICAgICAgICAgICdzYWZldHlGYWN0b3InLCAnYnVja2xpbmdTYWZldHlGYWN0b3InLCAnYnVja2xpbmdTZkdyb3VwJywgJ3VzZVlpZWxkQ2hlY2snLA0KICAgICAgICAgICAgJ2FwcGxpZWRMb2FkJywgJ3N0cmVzc0NvbmNlbnRyYXRpb24nLA0KICAgICAgICAgICAgJ2VuYWJsZUJ1Y2tsaW5nJywgJ2NvbHVtbkxlbmd0aCcsICdlbmRDb25kaXRpb24nLCAnZWZmZWN0aXZlTGVuZ3RoRmFjdG9yJywNCiAgICAgICAgICAgICdjdXN0b21LR3JvdXAnLCAnbW9tZW50T2ZJbmVydGlhJywNCiAgICAgICAgICAgICdjYWxjdWxhdGVCdG4nLCAnd2FybmluZ3MnLCAncmVzdWx0c1BhbmVsJywNCiAgICAgICAgICAgICdzdGF0dXNCYW5uZXInLCAnc3RhdHVzVGV4dCcsDQogICAgICAgICAgICAnY29tcHJlc3Npb25WaXonLCAnc2VjdGlvblZpeicsDQogICAgICAgICAgICAnY29tcFV0aWxGaWxsJywgJ2Nv\"+\"bXBVdGlsVGV4dCcsICdidWNrVXRpbEZpbGwnLCAnYnVja1V0aWxUZXh0JywgJ2J1Y2tsaW5nVXRpbENhcmQnLA0KICAgICAgICAgICAgJ3Jlc0FyZWEnLCAncmVzU2MnLCAncmVzQWxsb3dTdHJlc3MnLCAncmVzQWxsb3dZaWVsZCcsICdyZXNHb3Zlcm5pbmdTdHJlc3MnLA0KICAgICAgICAgICAgJ3Jlc0FjdHVhbFN0cmVzcycsICdyZXNMb2NhbFN0cmVzcycsICdyZXNNYXhMb2FkJywgJ3Jlc0FsbG93TG9hZCcsDQogICAgICAgICAgICAncmVzUmVxdWlyZWRBcmVhJywgJ3Jlc1JlcXVpcmVkRGlhJywgJ3Jlc0FjdHVhbFNGJywgJ3Jlc1V0aWxpemF0aW9uJywNCiAgICAgICAgICAgICdyZXNTdHJlc3NSZXNlcnZlJywgJ3Jlc0xvYWRSZXNlcnZlJywgJ3Jlc1JhZGl1c0d5cmF0aW9uJywgJ3Jlc1NsZW5kZXJuZXNzJywNCiAgICAgICAgICAgICdyZXNFdWxlckxvYWQnLCAncmVzQnVja2xpbmdBbGxvdycsICdyZXNCdWNrbGluZ1V0aWwnLCAncmVzR292ZXJuaW5nQ2FwYWNpdHknLA0KICAgICAgICAgICAgJ3Jlc0dvdmVybmluZ01vZGUnLCAncmVzRGVzaWduU3RhdHVzJywNCiAgICAgICAgICAgICdyZWNvbW1lbmRhdGlvbnMnLCAncmVjb21tZW5kYXRpb25zTGlzdCcsDQogICAgICAgICAgICAncmVzSXRlbUFsbG93WWllbGQnLCAncmVzSXRlbUdvdmVybmluZ1N0cmVzcycsICdyZXNJdGVtQWN0dWFsU3RyZXNzJywNCiAgICAgICAgICAgICdyZXNJdGVtTG9jYWxTdHJlc3MnLCAncmVzSXRlbU1heExvYWQnLCAncmVzSXRlbUFsbG93TG9hZCcsDQogICAgICAgICAgICAncmVzSXRlbVJlcXVpcmVkQXJlYScsICdyZXNJdGVtUmVxdWlyZWREaWEnLCAncmVzSXRlbUFjdHVhbFNGJywNCiAgICAgICAgICAgICdyZXNJdGVtVXRpbGl6YXRpb24nLCAncmVzSXRlbVN0cmVzc1Jlc2VydmUnLCAncmVzSXRlbUxvYWRSZXNlcnZlJywNCiAgICAgICAgICAgICdyZXNJdGVtUmFkaXVzR3lyYXRpb24nLCAncmVzSXRlbVNsZW5kZXJuZXNzJywgJ3Jlc0l0ZW1FdWxlckxvYWQnLA0KICAgICAgICAgICAgJ3Jlc0l0ZW1CdWNrbGluZ0FsbG93JywgJ3Jlc0l0ZW1CdWNrbGluZ1V0aWwnLCAncmVzSXRlbUdvdmVybmluZ0NhcGFjaXR5JywNCiAgICAgICAgICAgICdyZXNJdGVtR292ZXJuaW5nTW9kZScNCiAgICAgICAgXTsNCiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IGVsc1tpZF0gPSAkKGlkKTsgfSk7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG51bShpZCkgew0KICAgICAgICBjb25zdCBlbCA9IGVsc1tpZF07DQogICAgICAgIGlmICghZWwpIHJldHVybiAwOw0KICAgICAgICBpZiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94JykgcmV0dXJuIGVsLmNoZWNrZWQgPyAxIDogMDsNCiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOw0KICAgICAgICByZXR1cm4gaXNOYU4odikgPyAwIDogdjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpc0NoZWNrZWQoaWQpIHsNCiAgICAgICAgY29uc3Qg\"+\"ZWwgPSBlbHNbaWRdOw0KICAgICAgICByZXR1cm4gZWwgPyBlbC5jaGVja2VkIDogZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm10KHZhbCwgZGVjaW1hbHMpIHsNCiAgICAgICAgZGVjaW1hbHMgPSBkZWNpbWFscyA9PT0gdW5kZWZpbmVkID8gMiA6IGRlY2ltYWxzOw0KICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZSh2YWwpKSByZXR1cm4gJy0nOw0KICAgICAgICBpZiAoTWF0aC5hYnModmFsKSA+PSAxZTkgfHwgKE1hdGguYWJzKHZhbCkgPCAwLjAwMSAmJiB2YWwgIT09IDApKSByZXR1cm4gdmFsLnRvRXhwb25lbnRpYWwoMyk7DQogICAgICAgIHJldHVybiB2YWwudG9GaXhlZChkZWNpbWFscyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0VW5pdHMoKSB7DQogICAgICAgIHJldHVybiBVTklUU1tlbHMudW5pdFN5c3RlbS52YWx1ZV0gfHwgVU5JVFMubWV0cmljOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgICAgIGNvbnN0IHUgPSBnZXRVbml0cygpOw0KICAgICAgICBxc2EoJy5jc2MtdS1zdHJlc3MnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUuc3RyZXNzOyB9KTsNCiAgICAgICAgcXNhKCcuY3NjLXUtZm9yY2UnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUuZm9yY2U7IH0pOw0KICAgICAgICBxc2EoJy5jc2MtdS1sZW5ndGgnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUubGVuZ3RoOyB9KTsNCiAgICAgICAgcXNhKCcuY3NjLXUtYXJlYScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IGVsLnRleHRDb250ZW50ID0gdS5hcmVhOyB9KTsNCiAgICAgICAgcXNhKCcuY3NjLXUtbW9kdWx1cycpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IGVsLnRleHRDb250ZW50ID0gdS5tb2R1bHVzOyB9KTsNCiAgICAgICAgcXNhKCcuY3NjLXUtY29sTGVuZ3RoJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgZWwudGV4dENvbnRlbnQgPSB1LmNvbExlbmd0aDsgfSk7DQogICAgICAgIHFzYSgnLmNzYy11LWluZXJ0aWEnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUuaW5lcnRpYTsgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY0dlb21ldHJ5KCkgew0KICAgICAgICBjb25zdCB1ID0gZ2V0VW5pdHMoKTsNCiAgICAgICAgY29uc3QgdHlwZSA9IGVscy5zZWN0aW9uVHlwZS52YWx1ZTsNCiAgICAgICAgbGV0IGFyZWEgPSAwLCBJID0gMCwgSXdlYWsgPSAwOw0KDQogICAgICAgIGlmICh0eXBlID09PSAnc29saWRfcm91bmQnKSB7DQogICAgICAgICAgICBjb25zdCBkID0gdS5sZW5ndGhGcm9tSW5wdXQobnVtKCdkaWFtZXRlcicpKTsNCiAgICAgICAgICAgIGFyZWEgPSBNYXRoLlBJICogZCAqIGQgLyA0Ow0KICAgICAgICAgICAgSSA9IE1hdGguUEkgKiBNYXRoLnBvdyhkLCA0KSAvIDY0Ow0KICAg\"+\"ICAgICAgICAgSXdlYWsgPSBJOw0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdob2xsb3dfcm91bmQnKSB7DQogICAgICAgICAgICBjb25zdCBEID0gdS5sZW5ndGhGcm9tSW5wdXQobnVtKCdvdXRlckRpYW1ldGVyJykpOw0KICAgICAgICAgICAgY29uc3QgZCA9IHUubGVuZ3RoRnJvbUlucHV0KG51bSgnaW5uZXJEaWFtZXRlcicpKTsNCiAgICAgICAgICAgIGFyZWEgPSBNYXRoLlBJICogKEQgKiBEIC0gZCAqIGQpIC8gNDsNCiAgICAgICAgICAgIEkgPSBNYXRoLlBJICogKE1hdGgucG93KEQsIDQpIC0gTWF0aC5wb3coZCwgNCkpIC8gNjQ7DQogICAgICAgICAgICBJd2VhayA9IEk7DQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JlY3RhbmdsZScpIHsNCiAgICAgICAgICAgIGNvbnN0IGIgPSB1Lmxlbmd0aEZyb21JbnB1dChudW0oJ3dpZHRoJykpOw0KICAgICAgICAgICAgY29uc3QgaCA9IHUubGVuZ3RoRnJvbUlucHV0KG51bSgndGhpY2tuZXNzJykpOw0KICAgICAgICAgICAgYXJlYSA9IGIgKiBoOw0KICAgICAgICAgICAgY29uc3QgSTEgPSBiICogTWF0aC5wb3coaCwgMykgLyAxMjsNCiAgICAgICAgICAgIGNvbnN0IEkyID0gaCAqIE1hdGgucG93KGIsIDMpIC8gMTI7DQogICAgICAgICAgICBJd2VhayA9IE1hdGgubWluKEkxLCBJMik7DQogICAgICAgICAgICBJID0gSXdlYWs7DQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NxdWFyZScpIHsNCiAgICAgICAgICAgIGNvbnN0IGEgPSB1Lmxlbmd0aEZyb21JbnB1dChudW0oJ3NxdWFyZVNpZGUnKSk7DQogICAgICAgICAgICBhcmVhID0gYSAqIGE7DQogICAgICAgICAgICBJID0gTWF0aC5wb3coYSwgNCkgLyAxMjsNCiAgICAgICAgICAgIEl3ZWFrID0gSTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGFyZWEgPSB1LmFyZWFGcm9tSW5wdXQobnVtKCdjdXN0b21BcmVhJykpOw0KICAgICAgICAgICAgSXdlYWsgPSAwOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgbWFudWFsSSA9IG51bSgnbW9tZW50T2ZJbmVydGlhJyk7DQogICAgICAgIGlmIChtYW51YWxJID4gMCkgew0KICAgICAgICAgICAgSSA9IHUuaW5lcnRpYUZyb21JbnB1dChtYW51YWxJKTsNCiAgICAgICAgICAgIEl3ZWFrID0gSTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJlZHVjdGlvbiA9IG51bSgnbmV0QXJlYVJlZHVjdGlvbicpIC8gMTAwOw0KICAgICAgICBjb25zdCBuZXRBcmVhID0gYXJlYSAqICgxIC0gcmVkdWN0aW9uKTsNCg0KICAgICAgICByZXR1cm4geyBncm9zc0FyZWE6IGFyZWEsIGFyZWE6IG5ldEFyZWEsIEk6IEl3ZWFrLCB0eXBlOiB0eXBlIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlSygpIHsNCiAgICAgICAgaWYgKGVscy5lbmRDb25kaXRpb24udmFsdWUgPT09ICdjdXN0b20nKSB7DQogICAgICAgICAgICByZXR1cm4gbnVtKCdlZmZlY3RpdmVMZW5ndGhGYWN0b3InKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4g\"+\"cGFyc2VGbG9hdChlbHMuZW5kQ29uZGl0aW9uLnZhbHVlKSB8fCAxLjA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRmllbGRWaXNpYmlsaXR5KCkgew0KICAgICAgICBjb25zdCBjYWxjTW9kZSA9IGVscy5jYWxjTW9kZS52YWx1ZTsNCiAgICAgICAgY29uc3Qgc2VjdGlvblR5cGUgPSBlbHMuc2VjdGlvblR5cGUudmFsdWU7DQogICAgICAgIGNvbnN0IGJ1Y2tsaW5nRW5hYmxlZCA9IGlzQ2hlY2tlZCgnZW5hYmxlQnVja2xpbmcnKSB8fCBjYWxjTW9kZSA9PT0gJ2J1Y2tsaW5nQ2hlY2snOw0KDQogICAgICAgIHFzYSgnLmNzYy1nZW9tLWZpZWxkJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gZWwuZGF0YXNldC5zZWN0aW9ucy5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnY3NjLWhpZGRlbicsIHNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblR5cGUpIDwgMCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHFzYSgnLmNzYy1sb2FkLWZpZWxkJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gZWwuZGF0YXNldC5tb2Rlcy5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnY3NjLWhpZGRlbicsIG1vZGVzLmluZGV4T2YoY2FsY01vZGUpIDwgMCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHFzYSgnLmNzYy1idWNrbGluZy1maWVsZCcpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdjc2MtaGlkZGVuJywgIWJ1Y2tsaW5nRW5hYmxlZCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5jdXN0b21LR3JvdXAuY2xhc3NMaXN0LnRvZ2dsZSgnY3NjLWhpZGRlbicsIGVscy5lbmRDb25kaXRpb24udmFsdWUgIT09ICdjdXN0b20nKTsNCg0KICAgICAgICBpZiAoY2FsY01vZGUgPT09ICdyZXF1aXJlZERpYW1ldGVyJykgew0KICAgICAgICAgICAgZWxzLnNlY3Rpb25UeXBlLnZhbHVlID0gJ3NvbGlkX3JvdW5kJzsNCiAgICAgICAgICAgIHFzYSgnLmNzYy1nZW9tLWZpZWxkJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdjc2MtaGlkZGVuJywgZWwuZGF0YXNldC5zZWN0aW9ucy5pbmRleE9mKCdzb2xpZF9yb3VuZCcpIDwgMCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChjYWxjTW9kZSA9PT0gJ2J1Y2tsaW5nQ2hlY2snKSB7DQogICAgICAgICAgICBlbHMuZW5hYmxlQnVja2xpbmcuY2hlY2tlZCA9IHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBzaG93TG9hZCA9IFsnc3RyZXNzQ2hlY2snLCAnc2FmZXR5RmFjdG9yJywgJ3JlcXVpcmVkQXJlYScsICdyZXF1aXJlZERpYW1ldGVyJywgJ2J1Y2tsaW5nQ2hlY2snXS5pbmRleE9mKGNhbGNNb2RlKSA+PSAwOw0KICAgICAgICBxc2EoJy5jc2MtbG9hZC1m\"+\"aWVsZFtkYXRhLW1vZGVzKj0iYXBwbGllZExvYWQiXScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBpZiAoY2FsY01vZGUgPT09ICdtYXhMb2FkJyB8fCBjYWxjTW9kZSA9PT0gJ2FsbG93YWJsZUxvYWQnKSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnY3NjLWhpZGRlbicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsUHJlc2V0KCkgew0KICAgICAgICBjb25zdCBrZXkgPSBlbHMubWF0ZXJpYWwudmFsdWU7DQogICAgICAgIGlmIChrZXkgPT09ICdjdXN0b20nKSByZXR1cm47DQogICAgICAgIGNvbnN0IG1hdCA9IE1BVEVSSUFMU1trZXldOw0KICAgICAgICBjb25zdCB1ID0gZ2V0VW5pdHMoKTsNCiAgICAgICAgZWxzLmNvbXByZXNzaXZlU3RyZW5ndGgudmFsdWUgPSBmbXQodS5zdHJlc3NUb0Rpc3BsYXkobWF0LnNjKSwgMSk7DQogICAgICAgIGlmIChtYXQuc3kgPiAwKSBlbHMueWllbGRTdHJlbmd0aC52YWx1ZSA9IGZtdCh1LnN0cmVzc1RvRGlzcGxheShtYXQuc3kpLCAxKTsNCiAgICAgICAgZWxzLnlvdW5nc01vZHVsdXMudmFsdWUgPSBmbXQodS5tb2R1bHVzVG9EaXNwbGF5KG1hdC5FKSwgMSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGUoZ2VvKSB7DQogICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107DQogICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOw0KICAgICAgICBjb25zdCBzZiA9IG51bSgnc2FmZXR5RmFjdG9yJyk7DQogICAgICAgIGNvbnN0IHUgPSBnZXRVbml0cygpOw0KICAgICAgICBjb25zdCBjYWxjTW9kZSA9IGVscy5jYWxjTW9kZS52YWx1ZTsNCiAgICAgICAgY29uc3QgYnVja2xpbmdFbmFibGVkID0gaXNDaGVja2VkKCdlbmFibGVCdWNrbGluZycpIHx8IGNhbGNNb2RlID09PSAnYnVja2xpbmdDaGVjayc7DQoNCiAgICAgICAgaWYgKHNmIDw9IDApIGVycm9ycy5wdXNoKCdEZXNpZ24gc2FmZXR5IGZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICBpZiAobnVtKCdjb21wcmVzc2l2ZVN0cmVuZ3RoJykgPD0gMCkgZXJyb3JzLnB1c2goJ0NvbXByZXNzaXZlIHN0cmVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQoNCiAgICAgICAgY29uc3QgbmVlZHNBcmVhID0gWydzdHJlc3NDaGVjaycsICdtYXhMb2FkJywgJ2FsbG93YWJsZUxvYWQnLCAnc2FmZXR5RmFjdG9yJywgJ2J1Y2tsaW5nQ2hlY2snXS5pbmRleE9mKGNhbGNNb2RlKSA+PSAwOw0KICAgICAgICBpZiAobmVlZHNBcmVhICYmIGdlby5hcmVhIDw9IDApIHsNCiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdDcm9zcy1zZWN0aW9uYWwgYXJlYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKFsncmVxdWlyZWRBcmVhJywgJ3JlcXVpcmVkRGlhbWV0ZXInLCAnc3RyZXNzQ2hlY2snLCAnc2FmZXR5RmFjdG9yJywgJ2J1Y2tsaW5nQ2hl\"+\"Y2snXS5pbmRleE9mKGNhbGNNb2RlKSA+PSAwICYmIG51bSgnYXBwbGllZExvYWQnKSA8PSAwKSB7DQogICAgICAgICAgICBpZiAoY2FsY01vZGUgIT09ICdtYXhMb2FkJyAmJiBjYWxjTW9kZSAhPT0gJ2FsbG93YWJsZUxvYWQnKSB7DQogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ0FwcGxpZWQgY29tcHJlc3NpdmUgbG9hZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVscy5zZWN0aW9uVHlwZS52YWx1ZSA9PT0gJ2hvbGxvd19yb3VuZCcpIHsNCiAgICAgICAgICAgIGNvbnN0IG9kID0gdS5sZW5ndGhGcm9tSW5wdXQobnVtKCdvdXRlckRpYW1ldGVyJykpOw0KICAgICAgICAgICAgY29uc3QgaWQgPSB1Lmxlbmd0aEZyb21JbnB1dChudW0oJ2lubmVyRGlhbWV0ZXInKSk7DQogICAgICAgICAgICBpZiAoaWQgPD0gMCB8fCBvZCA8PSAwKSBlcnJvcnMucHVzaCgnT3V0ZXIgYW5kIGlubmVyIGRpYW1ldGVycyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgaWYgKGlkID49IG9kKSBlcnJvcnMucHVzaCgnSW5uZXIgZGlhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3V0ZXIgZGlhbWV0ZXIuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBkaW1GaWVsZHMgPSBbJ2RpYW1ldGVyJywgJ291dGVyRGlhbWV0ZXInLCAnaW5uZXJEaWFtZXRlcicsICd3aWR0aCcsICd0aGlja25lc3MnLCAnc3F1YXJlU2lkZSddOw0KICAgICAgICBsZXQgZGltRXJyb3IgPSBmYWxzZTsNCiAgICAgICAgZGltRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7DQogICAgICAgICAgICBjb25zdCBlbCA9IGVsc1tmaWVsZF07DQogICAgICAgICAgICBpZiAoZWwgJiYgIWVsLmNsb3Nlc3QoJy5jc2MtaGlkZGVuJykgJiYgbnVtKGZpZWxkKSA8PSAwKSBkaW1FcnJvciA9IHRydWU7DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoZWxzLnNlY3Rpb25UeXBlLnZhbHVlID09PSAnY3VzdG9tJyAmJiBudW0oJ2N1c3RvbUFyZWEnKSA8PSAwKSBkaW1FcnJvciA9IHRydWU7DQogICAgICAgIGlmIChkaW1FcnJvcikgZXJyb3JzLnB1c2goJ0Nyb3NzLXNlY3Rpb24gZGltZW5zaW9ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KDQogICAgICAgIGlmIChidWNrbGluZ0VuYWJsZWQpIHsNCiAgICAgICAgICAgIGlmIChudW0oJ3lvdW5nc01vZHVsdXMnKSA8PSAwKSBlcnJvcnMucHVzaCgnWW91bmdcJ3MgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBidWNrbGluZyBjYWxjdWxhdGlvbnMuJyk7DQogICAgICAgICAgICBpZiAobnVtKCdjb2x1bW5MZW5ndGgnKSA8PSAwKSBlcnJvcnMucHVzaCgnQ29sdW1uIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBidWNrbGluZyBjYWxjdWxhdGlvbnMuJyk7DQogICAgICAgICAgICBjb25zdCBLID0gZ2V0RWZmZWN0aXZlSygpOw0KICAgICAgICAgICAgaWYgKEsg\"+\"PD0gMCkgZXJyb3JzLnB1c2goJ0VmZmVjdGl2ZSBsZW5ndGggZmFjdG9yIEsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgIGlmIChnZW8uSSA8PSAwICYmIG51bSgnbW9tZW50T2ZJbmVydGlhJykgPD0gMCkgew0KICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdTZWNvbmQgbW9tZW50IG9mIGFyZWEgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBmb3IgYnVja2xpbmcgY2FsY3VsYXRpb25zLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3Qgc2ZiID0gbnVtKCdidWNrbGluZ1NhZmV0eUZhY3RvcicpIHx8IHNmOw0KICAgICAgICBpZiAoc2ZiIDw9IDApIGVycm9ycy5wdXNoKCdCdWNrbGluZyBzYWZldHkgZmFjdG9yIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQoNCiAgICAgICAgaWYgKHNmIDwgMS41KSB3YXJuaW5ncy5wdXNoKHsgdHlwZTogJ3dhcm4nLCBtc2c6ICdTYWZldHkgZmFjdG9yIGJlbG93IDEuNSBtYXkgYmUgdG9vIGxvdyBmb3IgdW5jZXJ0YWluIG9yIGR5bmFtaWMgbG9hZGluZyBjb25kaXRpb25zLicgfSk7DQoNCiAgICAgICAgcmV0dXJuIHsgZXJyb3JzOiBlcnJvcnMsIHdhcm5pbmdzOiB3YXJuaW5ncyB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGNCdWNrbGluZyhnZW8sIEUsIHNmQikgew0KICAgICAgICBjb25zdCB1ID0gZ2V0VW5pdHMoKTsNCiAgICAgICAgY29uc3QgTCA9IHUuY29sTGVuZ3RoRnJvbUlucHV0KG51bSgnY29sdW1uTGVuZ3RoJykpOw0KICAgICAgICBjb25zdCBLID0gZ2V0RWZmZWN0aXZlSygpOw0KICAgICAgICBjb25zdCBMZSA9IEsgKiBMOw0KICAgICAgICBjb25zdCBJID0gZ2VvLkk7DQogICAgICAgIGNvbnN0IEEgPSBnZW8uYXJlYTsNCg0KICAgICAgICBpZiAoSSA8PSAwIHx8IEUgPD0gMCB8fCBMZSA8PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IFBjciA9IE1hdGguUEkgKiBNYXRoLlBJICogRSAqIEkgLyAoTGUgKiBMZSk7DQogICAgICAgIGNvbnN0IHIgPSBNYXRoLnNxcnQoSSAvIEEpOw0KICAgICAgICBjb25zdCBzbGVuZGVybmVzcyA9IExlIC8gcjsNCiAgICAgICAgY29uc3Qgc2lnbWFDciA9IE1hdGguUEkgKiBNYXRoLlBJICogRSAvIChzbGVuZGVybmVzcyAqIHNsZW5kZXJuZXNzKTsNCiAgICAgICAgY29uc3QgRmFsbG93QnVja2xpbmcgPSBQY3IgLyBzZkI7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIFBjcjogUGNyLA0KICAgICAgICAgICAgcjogciwNCiAgICAgICAgICAgIHNsZW5kZXJuZXNzOiBzbGVuZGVybmVzcywNCiAgICAgICAgICAgIHNpZ21hQ3I6IHNpZ21hQ3IsDQogICAgICAgICAgICBGYWxsb3dCdWNrbGluZzogRmFsbG93QnVja2xpbmcsDQogICAgICAgICAgICBMZTogTGUsDQogICAgICAgICAgICBLOiBLDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0RGVzaWduU3RhdHVzKGNvbXBV\"+\"dGlsLCBidWNrVXRpbCwgaGFzQnVja2xpbmcsIGNoZWNrU3RyZXNzLCBhbGxvd1N0cmVzcykgew0KICAgICAgICBsZXQgc3RhdHVzID0gJ1NhZmUnOw0KICAgICAgICBsZXQgc3RhdHVzQ2xhc3MgPSAnc2FmZSc7DQogICAgICAgIGxldCBpY29uID0gJ1x1MjcxMyc7DQoNCiAgICAgICAgY29uc3QgY29tcE92ZXIgPSBjb21wVXRpbCA+IDEwMCB8fCBjaGVja1N0cmVzcyA+IGFsbG93U3RyZXNzOw0KICAgICAgICBjb25zdCBidWNrT3ZlciA9IGhhc0J1Y2tsaW5nICYmIGJ1Y2tVdGlsID4gMTAwOw0KICAgICAgICBjb25zdCBjb21wQ2F1dGlvbiA9IGNvbXBVdGlsID49IDgwICYmIGNvbXBVdGlsIDw9IDEwMDsNCiAgICAgICAgY29uc3QgYnVja0NhdXRpb24gPSBoYXNCdWNrbGluZyAmJiBidWNrVXRpbCA+PSA4MCAmJiBidWNrVXRpbCA8PSAxMDA7DQoNCiAgICAgICAgaWYgKGNvbXBPdmVyIHx8IGJ1Y2tPdmVyKSB7DQogICAgICAgICAgICBzdGF0dXMgPSAnVW5zYWZlJzsNCiAgICAgICAgICAgIHN0YXR1c0NsYXNzID0gJ3Vuc2FmZSc7DQogICAgICAgICAgICBpY29uID0gJ1x1MjcxNyc7DQogICAgICAgIH0gZWxzZSBpZiAoY29tcENhdXRpb24gfHwgYnVja0NhdXRpb24pIHsNCiAgICAgICAgICAgIHN0YXR1cyA9ICdDYXV0aW9uJzsNCiAgICAgICAgICAgIHN0YXR1c0NsYXNzID0gJ2NhdXRpb24nOw0KICAgICAgICAgICAgaWNvbiA9ICchJzsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLCBzdGF0dXNDbGFzczogc3RhdHVzQ2xhc3MsIGljb246IGljb24gfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRHb3Zlcm5pbmdNb2RlKEZjb21wcmVzc2lvbiwgRmJ1Y2tsaW5nLCBoYXNCdWNrbGluZykgew0KICAgICAgICBpZiAoIWhhc0J1Y2tsaW5nIHx8IEZidWNrbGluZyA8PSAwKSByZXR1cm4gJ0NvbXByZXNzaW9uIFN0cmVuZ3RoIEdvdmVybnMnOw0KICAgICAgICBjb25zdCByYXRpbyA9IEZjb21wcmVzc2lvbiAvIEZidWNrbGluZzsNCiAgICAgICAgaWYgKHJhdGlvIDwgMC45KSByZXR1cm4gJ0NvbXByZXNzaW9uIFN0cmVuZ3RoIEdvdmVybnMnOw0KICAgICAgICBpZiAocmF0aW8gPiAxLjEpIHJldHVybiAnQnVja2xpbmcgR292ZXJucyc7DQogICAgICAgIHJldHVybiAnQm90aCBOZWFyIExpbWl0JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRSZWNvbW1lbmRhdGlvbnMocikgew0KICAgICAgICBjb25zdCByZWNzID0gW107DQogICAgICAgIGlmIChyLnV0aWxpemF0aW9uID4gMTAwIHx8IChyLmJ1Y2tsaW5nICYmIHIuYnVja2xpbmdVdGlsID4gMTAwKSkgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdBcHBsaWVkIGxvYWQgb3Igc3RyZXNzIGV4Y2VlZHMgYWxsb3dhYmxlIGxpbWl0cy4gUmVkdWNlIGxvYWQgb3IgaW5jcmVhc2Ugc2VjdGlvbiBjYXBhY2l0eS4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoci51dGlsaXphdGlvbiA+IDgwKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ0lu\"+\"Y3JlYXNlIGNyb3NzLXNlY3Rpb25hbCBhcmVhIGlmIGNvbXByZXNzaXZlIHN0cmVzcyBpcyBleGNlc3NpdmUuJyk7DQogICAgICAgICAgICByZWNzLnB1c2goJ0luY3JlYXNlIGRpYW1ldGVyIG9yIHdhbGwgdGhpY2tuZXNzIGZvciByb3VuZCBtZW1iZXJzLicpOw0KICAgICAgICAgICAgcmVjcy5wdXNoKCdTZWxlY3QgYSBtYXRlcmlhbCB3aXRoIGhpZ2hlciBjb21wcmVzc2l2ZSBzdHJlbmd0aC4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoci5idWNrbGluZyAmJiByLmdvdmVybmluZ01vZGUgPT09ICdCdWNrbGluZyBHb3Zlcm5zJykgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdSZWR1Y2UgdW5zdXBwb3J0ZWQgbGVuZ3RoIGlmIGJ1Y2tsaW5nIGdvdmVybnMuJyk7DQogICAgICAgICAgICByZWNzLnB1c2goJ0ltcHJvdmUgZW5kIHJlc3RyYWludCB0byByZWR1Y2UgZWZmZWN0aXZlIGJ1Y2tsaW5nIGxlbmd0aCB3aGVyZSBzdHJ1Y3R1cmFsbHkgYXBwcm9wcmlhdGUuJyk7DQogICAgICAgICAgICByZWNzLnB1c2goJ0luY3JlYXNlIHNlY29uZCBtb21lbnQgb2YgYXJlYSB0byBpbXByb3ZlIGNvbHVtbiBzdGFiaWxpdHkuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5zZWN0aW9uVHlwZS52YWx1ZSA9PT0gJ3JlY3RhbmdsZScpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnQ2hlY2sgdGhlIHdlYWtlciBidWNrbGluZyBheGlzIGZvciByZWN0YW5ndWxhciBtZW1iZXJzLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLmJ1Y2tsaW5nICYmIHIuYnVja2xpbmcuc2xlbmRlcm5lc3MgPCAzMCkgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdTbGVuZGVybmVzcyByYXRpbyBpcyBsb3cuIEV1bGVyIGJ1Y2tsaW5nIG1heSBub3QgYmUgdGhlIGdvdmVybmluZyBmYWlsdXJlIG1vZGUgZm9yIHNob3J0IGNvbHVtbnMuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5zZWN0aW9uVHlwZS52YWx1ZSA9PT0gJ2hvbGxvd19yb3VuZCcpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnUGVyZm9ybSBsb2NhbCBidWNrbGluZyBjaGVja3MgZm9yIHRoaW4td2FsbGVkIG1lbWJlcnMuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG51bSgnc3RyZXNzQ29uY2VudHJhdGlvbicpID4gMSkgew0KICAgICAgICAgICAgcmVjcy5wdXNoKCdQZXJmb3JtIGJlYXJpbmcgb3IgY29udGFjdCBzdHJlc3MgY2hlY2tzIHdoZXJlIGNvbmNlbnRyYXRlZCBjb21wcmVzc2lvbiBpcyBwcmVzZW50LicpOw0KICAgICAgICB9DQogICAgICAgIHJlY3MucHVzaCgnVXNlIGFwcGxpY2FibGUgZW5naW5lZXJpbmcgc3RhbmRhcmRzIGZvciBjcml0aWNhbCBzdHJ1Y3R1cmFsIGRlc2lnbnMuJyk7DQogICAgICAgIHJldHVybiByZWNzLmZpbHRlcihmdW5jdGlvbiAodiwgaSwgYSkgeyByZXR1cm4gYS5pbmRleE9mKHYpID09PSBpOyB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7DQogICAgICAgIGNvbnN0IHUgPSBnZXRVbml0cygpOw0K\"+\"ICAgICAgICBjb25zdCBnZW8gPSBjYWxjR2VvbWV0cnkoKTsNCiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlKGdlbyk7DQoNCiAgICAgICAgaWYgKHZhbGlkYXRpb24uZXJyb3JzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgIHNob3dXYXJuaW5ncyh2YWxpZGF0aW9uLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHsgdHlwZTogJ2Vycm9yJywgbXNnOiBlIH07IH0pKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGNhbGNNb2RlID0gZWxzLmNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBzZiA9IG51bSgnc2FmZXR5RmFjdG9yJyk7DQogICAgICAgIGNvbnN0IHNmQiA9IG51bSgnYnVja2xpbmdTYWZldHlGYWN0b3InKSB8fCBzZjsNCiAgICAgICAgY29uc3Qga3QgPSBNYXRoLm1heChudW0oJ3N0cmVzc0NvbmNlbnRyYXRpb24nKSwgMSk7DQogICAgICAgIGNvbnN0IGJ1Y2tsaW5nRW5hYmxlZCA9IGlzQ2hlY2tlZCgnZW5hYmxlQnVja2xpbmcnKSB8fCBjYWxjTW9kZSA9PT0gJ2J1Y2tsaW5nQ2hlY2snOw0KDQogICAgICAgIGNvbnN0IFNjID0gdS5zdHJlc3NGcm9tSW5wdXQobnVtKCdjb21wcmVzc2l2ZVN0cmVuZ3RoJykpOw0KICAgICAgICBjb25zdCBTeSA9IHUuc3RyZXNzRnJvbUlucHV0KG51bSgneWllbGRTdHJlbmd0aCcpKTsNCiAgICAgICAgY29uc3QgRSA9IHUubW9kdWx1c0Zyb21JbnB1dChudW0oJ3lvdW5nc01vZHVsdXMnKSk7DQogICAgICAgIGNvbnN0IEYgPSB1LmZvcmNlRnJvbUlucHV0KG51bSgnYXBwbGllZExvYWQnKSk7DQoNCiAgICAgICAgbGV0IHNpZ21hQWxsb3dDb21wID0gU2MgLyBzZjsNCiAgICAgICAgbGV0IHNpZ21hQWxsb3dZaWVsZCA9IFN5ID4gMCA\/IFN5IC8gc2YgOiBJbmZpbml0eTsNCiAgICAgICAgbGV0IHNpZ21hQWxsb3cgPSBzaWdtYUFsbG93Q29tcDsNCiAgICAgICAgbGV0IGdvdmVybmluZ1N0cmVzc0xhYmVsID0gJ0NvbXByZXNzaXZlIHN0cmVuZ3RoJzsNCg0KICAgICAgICBpZiAoaXNDaGVja2VkKCd1c2VZaWVsZENoZWNrJykgJiYgU3kgPiAwKSB7DQogICAgICAgICAgICBpZiAoc2lnbWFBbGxvd1lpZWxkIDwgc2lnbWFBbGxvd0NvbXApIHsNCiAgICAgICAgICAgICAgICBzaWdtYUFsbG93ID0gc2lnbWFBbGxvd1lpZWxkOw0KICAgICAgICAgICAgICAgIGdvdmVybmluZ1N0cmVzc0xhYmVsID0gJ1lpZWxkIHN0cmVuZ3RoJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHNpZ21hQWN0dWFsID0gZ2VvLmFyZWEgPiAwID8gRiAvIGdlby5hcmVhIDogMDsNCiAgICAgICAgY29uc3Qgc2lnbWFMb2NhbCA9IHNpZ21hQWN0dWFsICoga3Q7DQogICAgICAgIGNvbnN0IEZtYXggPSBTYyAqIGdlby5hcmVhOw0KICAgICAgICBjb25zdCBGYWxsb3cgPSBzaWdtYUFsbG93ICogZ2VvLmFyZWE7DQogICAgICAgIGNvbnN0IHJlcXVpcmVk\"+\"QXJlYSA9IHNpZ21hQWxsb3cgPiAwID8gRiAvIHNpZ21hQWxsb3cgOiAwOw0KICAgICAgICBjb25zdCByZXF1aXJlZERpYSA9IHNpZ21hQWxsb3cgPiAwICYmIEYgPiAwID8gTWF0aC5zcXJ0KDQgKiBGIC8gKE1hdGguUEkgKiBzaWdtYUFsbG93KSkgOiAwOw0KICAgICAgICBjb25zdCBhY3R1YWxTRiA9IHNpZ21hQWN0dWFsID4gMCA\/IFNjIC8gc2lnbWFBY3R1YWwgOiBJbmZpbml0eTsNCiAgICAgICAgY29uc3QgdXRpbGl6YXRpb24gPSBzaWdtYUFsbG93ID4gMCA\/IChzaWdtYUFjdHVhbCAvIHNpZ21hQWxsb3cpICogMTAwIDogMDsNCiAgICAgICAgY29uc3QgbG9jYWxVdGlsaXphdGlvbiA9IHNpZ21hQWxsb3cgPiAwID8gKHNpZ21hTG9jYWwgLyBzaWdtYUFsbG93KSAqIDEwMCA6IDA7DQogICAgICAgIGNvbnN0IHN0cmVzc1Jlc2VydmUgPSBzaWdtYUFsbG93IC0gc2lnbWFBY3R1YWw7DQogICAgICAgIGNvbnN0IGxvYWRSZXNlcnZlID0gRmFsbG93IC0gRjsNCg0KICAgICAgICBsZXQgYnVja2xpbmcgPSBudWxsOw0KICAgICAgICBsZXQgYnVja2xpbmdVdGlsID0gMDsNCiAgICAgICAgbGV0IEZnb3Zlcm5pbmcgPSBGYWxsb3c7DQogICAgICAgIGxldCBnb3Zlcm5pbmdDYXBhY2l0eUxhYmVsID0gJ0NvbXByZXNzaW9uJzsNCg0KICAgICAgICBpZiAoYnVja2xpbmdFbmFibGVkKSB7DQogICAgICAgICAgICBidWNrbGluZyA9IGNhbGNCdWNrbGluZyhnZW8sIEUsIHNmQik7DQogICAgICAgICAgICBpZiAoYnVja2xpbmcpIHsNCiAgICAgICAgICAgICAgICBidWNrbGluZ1V0aWwgPSBidWNrbGluZy5GYWxsb3dCdWNrbGluZyA+IDAgPyAoRiAvIGJ1Y2tsaW5nLkZhbGxvd0J1Y2tsaW5nKSAqIDEwMCA6IDA7DQogICAgICAgICAgICAgICAgRmdvdmVybmluZyA9IE1hdGgubWluKEZhbGxvdywgYnVja2xpbmcuRmFsbG93QnVja2xpbmcpOw0KICAgICAgICAgICAgICAgIGdvdmVybmluZ0NhcGFjaXR5TGFiZWwgPSBGYWxsb3cgPD0gYnVja2xpbmcuRmFsbG93QnVja2xpbmcgPyAnQ29tcHJlc3Npb24nIDogJ0J1Y2tsaW5nJzsNCg0KICAgICAgICAgICAgICAgIGlmIChGID4gYnVja2xpbmcuRmFsbG93QnVja2xpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbi53YXJuaW5ncy5wdXNoKHsgdHlwZTogJ2Vycm9yJywgbXNnOiAnQXBwbGllZCBsb2FkIGV4Y2VlZHMgRXVsZXItYmFzZWQgYWxsb3dhYmxlIGJ1Y2tsaW5nIGxvYWQuJyB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGJ1Y2tsaW5nLnNsZW5kZXJuZXNzIDwgMzApIHsNCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbi53YXJuaW5ncy5wdXNoKHsgdHlwZTogJ3dhcm4nLCBtc2c6ICdTbGVuZGVybmVzcyByYXRpbyDOuyA9ICcgKyBmbXQoYnVja2xpbmcuc2xlbmRlcm5lc3MsIDEpICsgJyBpcyBiZWxvdyAzMC4gRXVsZXIgYnVja2xpbmcgbWF5IGJlIG91dHNpZGUgdGhlIHN1aXRhYmxlIHNsZW5kZXItY29sdW1uIHJhbmdlLicgfSk7\"+\"DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChidWNrbGluZy5zbGVuZGVybmVzcyA+IDIwMCkgew0KICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLndhcm5pbmdzLnB1c2goeyB0eXBlOiAnaW5mbycsIG1zZzogJ1ZlcnkgaGlnaCBzbGVuZGVybmVzcyByYXRpby4gVmVyaWZ5IGVuZCBjb25kaXRpb25zIGFuZCBtYXRlcmlhbCBlbGFzdGljIGxpbWl0LicgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgZ292ZXJuaW5nTW9kZSA9IGdldEdvdmVybmluZ01vZGUoRmFsbG93LCBidWNrbGluZyA\/IGJ1Y2tsaW5nLkZhbGxvd0J1Y2tsaW5nIDogSW5maW5pdHksIGJ1Y2tsaW5nRW5hYmxlZCAmJiAhIWJ1Y2tsaW5nKTsNCg0KICAgICAgICBjb25zdCBjaGVja1N0cmVzcyA9IGt0ID4gMSA\/IHNpZ21hTG9jYWwgOiBzaWdtYUFjdHVhbDsNCiAgICAgICAgY29uc3QgY2hlY2tVdGlsID0ga3QgPiAxID8gbG9jYWxVdGlsaXphdGlvbiA6IHV0aWxpemF0aW9uOw0KDQogICAgICAgIGlmIChjaGVja1N0cmVzcyA+IHNpZ21hQWxsb3cpIHsNCiAgICAgICAgICAgIHZhbGlkYXRpb24ud2FybmluZ3MucHVzaCh7IHR5cGU6ICdlcnJvcicsIG1zZzogJ0NvbXByZXNzaXZlIHN0cmVzcyBleGNlZWRzIGFsbG93YWJsZSBjb21wcmVzc2l2ZSBzdHJlc3MuJyB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoa3QgPiAxICYmIHNpZ21hTG9jYWwgPiBzaWdtYUFsbG93KSB7DQogICAgICAgICAgICB2YWxpZGF0aW9uLndhcm5pbmdzLnB1c2goeyB0eXBlOiAnZXJyb3InLCBtc2c6ICdMb2NhbCBzdHJlc3MgZXhjZWVkcyBhbGxvd2FibGUgZHVlIHRvIHN0cmVzcyBjb25jZW50cmF0aW9uIGZhY3RvciAoS3QgPSAnICsgZm10KGt0LCAyKSArICcpLicgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBkZXNpZ24gPSBnZXREZXNpZ25TdGF0dXModXRpbGl6YXRpb24sIGJ1Y2tsaW5nVXRpbCwgYnVja2xpbmdFbmFibGVkICYmICEhYnVja2xpbmcsIGNoZWNrU3RyZXNzLCBzaWdtYUFsbG93KTsNCg0KICAgICAgICBpZiAoZGVzaWduLnN0YXR1cyA9PT0gJ0NhdXRpb24nKSB7DQogICAgICAgICAgICB2YWxpZGF0aW9uLndhcm5pbmdzLnB1c2goeyB0eXBlOiAnd2FybicsIG1zZzogJ1V0aWxpemF0aW9uIGlzIGFwcHJvYWNoaW5nIHRoZSBkZXNpZ24gbGltaXQgKCcgKyBmbXQoY2hlY2tVdGlsLCAxKSArICclKS4nIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHsNCiAgICAgICAgICAgIHU6IHUsIGdlbzogZ2VvLCBTYzogU2MsIHNpZ21hQWxsb3c6IHNpZ21hQWxsb3csIHNpZ21hQWxsb3dDb21wOiBzaWdtYUFsbG93Q29tcCwNCiAgICAgICAgICAgIHNpZ21hQWxsb3dZaWVsZDogc2lnbWFBbGxvd1lpZWxkLCBnb3Zlcm5pbmdTdHJlc3NMYWJlbDogZ292ZXJuaW5nU3RyZXNzTGFiZWwsDQogICAgICAgICAgICBzaWdtYUFjdHVhbDogc2ln\"+\"bWFBY3R1YWwsIHNpZ21hTG9jYWw6IHNpZ21hTG9jYWwsIEZtYXg6IEZtYXgsIEZhbGxvdzogRmFsbG93LA0KICAgICAgICAgICAgcmVxdWlyZWRBcmVhOiByZXF1aXJlZEFyZWEsIHJlcXVpcmVkRGlhOiByZXF1aXJlZERpYSwgYWN0dWFsU0Y6IGFjdHVhbFNGLA0KICAgICAgICAgICAgdXRpbGl6YXRpb246IHV0aWxpemF0aW9uLCBsb2NhbFV0aWxpemF0aW9uOiBsb2NhbFV0aWxpemF0aW9uLCBzdHJlc3NSZXNlcnZlOiBzdHJlc3NSZXNlcnZlLA0KICAgICAgICAgICAgbG9hZFJlc2VydmU6IGxvYWRSZXNlcnZlLCBidWNrbGluZzogYnVja2xpbmcsIGJ1Y2tsaW5nVXRpbDogYnVja2xpbmdVdGlsLA0KICAgICAgICAgICAgRmdvdmVybmluZzogRmdvdmVybmluZywgZ292ZXJuaW5nQ2FwYWNpdHlMYWJlbDogZ292ZXJuaW5nQ2FwYWNpdHlMYWJlbCwNCiAgICAgICAgICAgIGdvdmVybmluZ01vZGU6IGdvdmVybmluZ01vZGUsIGRlc2lnbjogZGVzaWduLCBrdDoga3QsIEY6IEYsIHNmOiBzZiwgc2ZCOiBzZkIsDQogICAgICAgICAgICBjaGVja1V0aWw6IGNoZWNrVXRpbCwgY2FsY01vZGU6IGNhbGNNb2RlDQogICAgICAgIH07DQoNCiAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICBkaXNwbGF5UmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgdXBkYXRlVmlzdWFsaXphdGlvbnMocmVzdWx0cyk7DQogICAgICAgIHNob3dXYXJuaW5ncyh2YWxpZGF0aW9uLndhcm5pbmdzKTsNCiAgICAgICAgc2hvd1JlY29tbWVuZGF0aW9ucyhnZXRSZWNvbW1lbmRhdGlvbnMocmVzdWx0cykpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKHIpIHsNCiAgICAgICAgY29uc3QgdSA9IHIudTsNCiAgICAgICAgY29uc3QgbW9kZSA9IHIuY2FsY01vZGU7DQogICAgICAgIGNvbnN0IGt0ID0gci5rdDsNCg0KICAgICAgICBlbHMucmVzQXJlYS50ZXh0Q29udGVudCA9IGZtdCh1LmFyZWFUb0Rpc3BsYXkoci5nZW8uYXJlYSksIDIpICsgJyAnICsgdS5hcmVhOw0KICAgICAgICBlbHMucmVzU2MudGV4dENvbnRlbnQgPSBmbXQodS5zdHJlc3NUb0Rpc3BsYXkoci5TYykpICsgJyAnICsgdS5zdHJlc3M7DQogICAgICAgIGVscy5yZXNBbGxvd1N0cmVzcy50ZXh0Q29udGVudCA9IGZtdCh1LnN0cmVzc1RvRGlzcGxheShyLnNpZ21hQWxsb3dDb21wKSkgKyAnICcgKyB1LnN0cmVzczsNCg0KICAgICAgICBpZiAoaXNDaGVja2VkKCd1c2VZaWVsZENoZWNrJykgJiYgci5zaWdtYUFsbG93WWllbGQgPCBJbmZpbml0eSkgew0KICAgICAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbUFsbG93WWllbGQnLCBlbHMucmVzQWxsb3dZaWVsZCwgZm10KHUuc3RyZXNzVG9EaXNwbGF5KHIuc2lnbWFBbGxvd1lpZWxkKSkgKyAnICcgKyB1LnN0cmVzcyk7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtR292ZXJuaW5nU3RyZXNzJywgZWxzLnJlc0dvdmVybmluZ1N0cmVzcywNCiAgICAgICAgICAgICAgICBmbXQodS5zdHJlc3NU\"+\"b0Rpc3BsYXkoci5zaWdtYUFsbG93KSkgKyAnICcgKyB1LnN0cmVzcyArICcgKCcgKyByLmdvdmVybmluZ1N0cmVzc0xhYmVsICsgJyknKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtQWxsb3dZaWVsZCcpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdEl0ZW0oJ3Jlc0l0ZW1Hb3Zlcm5pbmdTdHJlc3MnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChbJ3N0cmVzc0NoZWNrJywgJ3NhZmV0eUZhY3RvcicsICdidWNrbGluZ0NoZWNrJ10uaW5kZXhPZihtb2RlKSA+PSAwICYmIHIuRiA+IDApIHsNCiAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1BY3R1YWxTdHJlc3MnLCBlbHMucmVzQWN0dWFsU3RyZXNzLCBmbXQodS5zdHJlc3NUb0Rpc3BsYXkoci5zaWdtYUFjdHVhbCkpICsgJyAnICsgdS5zdHJlc3MpOw0KICAgICAgICAgICAgaWYgKGt0ID4gMSkgew0KICAgICAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1Mb2NhbFN0cmVzcycsIGVscy5yZXNMb2NhbFN0cmVzcywgZm10KHUuc3RyZXNzVG9EaXNwbGF5KHIuc2lnbWFMb2NhbCkpICsgJyAnICsgdS5zdHJlc3MpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBoaWRlUmVzdWx0SXRlbSgncmVzSXRlbUxvY2FsU3RyZXNzJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtQWN0dWFsU0YnLCBlbHMucmVzQWN0dWFsU0YsIGZtdChyLmFjdHVhbFNGLCAyKSk7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtVXRpbGl6YXRpb24nLCBlbHMucmVzVXRpbGl6YXRpb24sIGZtdChyLnV0aWxpemF0aW9uLCAxKSArICcgJScpOw0KICAgICAgICAgICAgZWxzLnJlc1V0aWxpemF0aW9uLmNsYXNzTmFtZSA9ICdjc2MtcmVzdWx0LXZhbHVlICcgKyB1dGlsQ2xhc3Moci51dGlsaXphdGlvbik7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtU3RyZXNzUmVzZXJ2ZScsIGVscy5yZXNTdHJlc3NSZXNlcnZlLCBmbXQodS5zdHJlc3NUb0Rpc3BsYXkoci5zdHJlc3NSZXNlcnZlKSkgKyAnICcgKyB1LnN0cmVzcyk7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtTG9hZFJlc2VydmUnLCBlbHMucmVzTG9hZFJlc2VydmUsIGZtdCh1LmZvcmNlVG9EaXNwbGF5KHIubG9hZFJlc2VydmUpLCAyKSArICcgJyArIHUuZm9yY2UpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaGlkZVJlc3VsdEl0ZW0oJ3Jlc0l0ZW1BY3R1YWxTdHJlc3MnKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtTG9jYWxTdHJlc3MnKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtQWN0dWFsU0YnKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtVXRpbGl6YXRpb24nKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtU3RyZXNzUmVzZXJ2ZScpOw0KICAg\"+\"ICAgICAgICAgaGlkZVJlc3VsdEl0ZW0oJ3Jlc0l0ZW1Mb2FkUmVzZXJ2ZScpOw0KICAgICAgICB9DQoNCiAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbU1heExvYWQnLCBlbHMucmVzTWF4TG9hZCwgZm10KHUuZm9yY2VUb0Rpc3BsYXkoci5GbWF4KSwgMikgKyAnICcgKyB1LmZvcmNlKTsNCiAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbUFsbG93TG9hZCcsIGVscy5yZXNBbGxvd0xvYWQsIGZtdCh1LmZvcmNlVG9EaXNwbGF5KHIuRmFsbG93KSwgMikgKyAnICcgKyB1LmZvcmNlKTsNCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ3JlcXVpcmVkQXJlYScgfHwgKHIucmVxdWlyZWRBcmVhID4gMCAmJiByLkYgPiAwKSkgew0KICAgICAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbVJlcXVpcmVkQXJlYScsIGVscy5yZXNSZXF1aXJlZEFyZWEsIGZtdCh1LmFyZWFUb0Rpc3BsYXkoci5yZXF1aXJlZEFyZWEpLCAyKSArICcgJyArIHUuYXJlYSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbSgncmVzSXRlbVJlcXVpcmVkQXJlYScpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdyZXF1aXJlZERpYW1ldGVyJyB8fCAoci5yZXF1aXJlZERpYSA+IDAgJiYgci5GID4gMCkpIHsNCiAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1SZXF1aXJlZERpYScsIGVscy5yZXNSZXF1aXJlZERpYSwgZm10KHUubGVuZ3RoVG9EaXNwbGF5KHIucmVxdWlyZWREaWEpLCAyKSArICcgJyArIHUubGVuZ3RoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtUmVxdWlyZWREaWEnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLmJ1Y2tsaW5nKSB7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtUmFkaXVzR3lyYXRpb24nLCBlbHMucmVzUmFkaXVzR3lyYXRpb24sIGZtdCh1Lmxlbmd0aFRvRGlzcGxheShyLmJ1Y2tsaW5nLnIpLCAzKSArICcgJyArIHUubGVuZ3RoKTsNCiAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1TbGVuZGVybmVzcycsIGVscy5yZXNTbGVuZGVybmVzcywgZm10KHIuYnVja2xpbmcuc2xlbmRlcm5lc3MsIDEpKTsNCiAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1FdWxlckxvYWQnLCBlbHMucmVzRXVsZXJMb2FkLCBmbXQodS5mb3JjZVRvRGlzcGxheShyLmJ1Y2tsaW5nLlBjciksIDIpICsgJyAnICsgdS5mb3JjZSk7DQogICAgICAgICAgICBzZXRSZXN1bHRJdGVtKCdyZXNJdGVtQnVja2xpbmdBbGxvdycsIGVscy5yZXNCdWNrbGluZ0FsbG93LCBmbXQodS5mb3JjZVRvRGlzcGxheShyLmJ1Y2tsaW5nLkZhbGxvd0J1Y2tsaW5nKSwgMikgKyAnICcgKyB1LmZvcmNlKTsNCiAgICAgICAgICAgIHNldFJlc3VsdEl0ZW0oJ3Jlc0l0ZW1CdWNrbGluZ1V0aWwnLCBlbHMucmVzQnVja2xpbmdVdGlsLCBmbXQoci5idWNrbGluZ1V0aWwsIDEpICsgJyAlJyk7DQogICAgICAg\"+\"ICAgICBlbHMucmVzQnVja2xpbmdVdGlsLmNsYXNzTmFtZSA9ICdjc2MtcmVzdWx0LXZhbHVlICcgKyB1dGlsQ2xhc3Moci5idWNrbGluZ1V0aWwpOw0KICAgICAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbUdvdmVybmluZ0NhcGFjaXR5JywgZWxzLnJlc0dvdmVybmluZ0NhcGFjaXR5LA0KICAgICAgICAgICAgICAgIGZtdCh1LmZvcmNlVG9EaXNwbGF5KHIuRmdvdmVybmluZyksIDIpICsgJyAnICsgdS5mb3JjZSArICcgKCcgKyByLmdvdmVybmluZ0NhcGFjaXR5TGFiZWwgKyAnKScpOw0KICAgICAgICAgICAgc2V0UmVzdWx0SXRlbSgncmVzSXRlbUdvdmVybmluZ01vZGUnLCBlbHMucmVzR292ZXJuaW5nTW9kZSwgci5nb3Zlcm5pbmdNb2RlKTsNCiAgICAgICAgICAgIGVscy5idWNrbGluZ1V0aWxDYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ2NzYy1oaWRkZW4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtUmFkaXVzR3lyYXRpb24nKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtU2xlbmRlcm5lc3MnKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtRXVsZXJMb2FkJyk7DQogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbSgncmVzSXRlbUJ1Y2tsaW5nQWxsb3cnKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKCdyZXNJdGVtQnVja2xpbmdVdGlsJyk7DQogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbSgncmVzSXRlbUdvdmVybmluZ0NhcGFjaXR5Jyk7DQogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbSgncmVzSXRlbUdvdmVybmluZ01vZGUnKTsNCiAgICAgICAgICAgIGVscy5idWNrbGluZ1V0aWxDYXJkLmNsYXNzTGlzdC5hZGQoJ2NzYy1oaWRkZW4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGVscy5yZXNEZXNpZ25TdGF0dXMudGV4dENvbnRlbnQgPSByLmRlc2lnbi5zdGF0dXM7DQogICAgICAgIGVscy5yZXNEZXNpZ25TdGF0dXMuY2xhc3NOYW1lID0gJ2NzYy1yZXN1bHQtdmFsdWUgY3NjLScgKyByLmRlc2lnbi5zdGF0dXNDbGFzczsNCg0KICAgICAgICBlbHMuc3RhdHVzQmFubmVyLmNsYXNzTmFtZSA9ICdjc2Mtc3RhdHVzLWJhbm5lciBjc2MtJyArIHIuZGVzaWduLnN0YXR1c0NsYXNzOw0KICAgICAgICBlbHMuc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9IHIuZGVzaWduLnN0YXR1czsNCiAgICAgICAgZWxzLnN0YXR1c0Jhbm5lci5xdWVyeVNlbGVjdG9yKCcuY3NjLXN0YXR1cy1pY29uJykudGV4dENvbnRlbnQgPSByLmRlc2lnbi5pY29uOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHV0aWxDbGFzcyh1dGlsKSB7DQogICAgICAgIGlmICh1dGlsID4gMTAwKSByZXR1cm4gJ2NzYy11bnNhZmUnOw0KICAgICAgICBpZiAodXRpbCA+PSA4MCkgcmV0dXJuICdjc2MtY2F1dGlvbic7DQogICAgICAgIHJldHVybiAnY3NjLXNhZmUnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNldFV0aWxCYXIoZmlsbEVsLCB0ZXh0RWwsIHV0aWwp\"+\"IHsNCiAgICAgICAgY29uc3QgY2FwcGVkID0gTWF0aC5taW4odXRpbCwgMTUwKTsNCiAgICAgICAgZmlsbEVsLnN0eWxlLndpZHRoID0gTWF0aC5taW4oY2FwcGVkLCAxMDApICsgJyUnOw0KICAgICAgICBmaWxsRWwuY2xhc3NOYW1lID0gJ2NzYy11dGlsLWZpbGwgJyArIHV0aWxDbGFzcyh1dGlsKTsNCiAgICAgICAgdGV4dEVsLnRleHRDb250ZW50ID0gaXNGaW5pdGUodXRpbCkgPyBmbXQodXRpbCwgMSkgKyAnJScgOiAn4oCUJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVWaXN1YWxpemF0aW9ucyhyKSB7DQogICAgICAgIHNldFV0aWxCYXIoZWxzLmNvbXBVdGlsRmlsbCwgZWxzLmNvbXBVdGlsVGV4dCwgci51dGlsaXphdGlvbik7DQogICAgICAgIGlmIChyLmJ1Y2tsaW5nKSB7DQogICAgICAgICAgICBzZXRVdGlsQmFyKGVscy5idWNrVXRpbEZpbGwsIGVscy5idWNrVXRpbFRleHQsIHIuYnVja2xpbmdVdGlsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVscy5idWNrVXRpbEZpbGwuc3R5bGUud2lkdGggPSAnMCUnOw0KICAgICAgICAgICAgZWxzLmJ1Y2tVdGlsVGV4dC50ZXh0Q29udGVudCA9ICfigJQnOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgaXNCdWNrbGluZyA9IHIuZ292ZXJuaW5nTW9kZSA9PT0gJ0J1Y2tsaW5nIEdvdmVybnMnIHx8IChyLmJ1Y2tsaW5nICYmIHIuYnVja2xpbmdVdGlsID4gci51dGlsaXphdGlvbik7DQogICAgICAgIGVscy5jb21wcmVzc2lvblZpei5pbm5lckhUTUwgPSBkcmF3Q29tcHJlc3Npb25TVkcoaXNCdWNrbGluZyk7DQogICAgICAgIGVscy5zZWN0aW9uVml6LmlubmVySFRNTCA9IGRyYXdTZWN0aW9uU1ZHKHIuZ2VvLnR5cGUpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdDb21wcmVzc2lvblNWRyhpc0J1Y2tsaW5nKSB7DQogICAgICAgIGlmIChpc0J1Y2tsaW5nKSB7DQogICAgICAgICAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDIwMCAxNDAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMTQwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicgKw0KICAgICAgICAgICAgICAgICc8cGF0aCBkPSJNNjAsMzAgUTEwMCw4MCAxNDAsMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzI0NzFhMyIgc3Ryb2tlLXdpZHRoPSI0Ii8+JyArDQogICAgICAgICAgICAgICAgJzxsaW5lIHgxPSI2MCIgeTE9IjMwIiB4Mj0iNjAiIHkyPSIxMTAiIHN0cm9rZT0iIzU1NSIgc3Ryb2tlLXdpZHRoPSIzIi8+JyArDQogICAgICAgICAgICAgICAgJzxsaW5lIHgxPSIxNDAiIHkxPSIzMCIgeDI9IjE0MCIgeTI9IjExMCIgc3Ryb2tlPSIjNTU1IiBzdHJva2Utd2lkdGg9IjMiLz4nICsNCiAgICAgICAgICAgICAgICAnPHBvbHlnb24gcG9pbnRzPSI1MCwyMCA3MCwyMCA2MCw1IiBmaWxsPSIjZTc0YzNjIi8+JyArDQogICAgICAgICAgICAgICAgJzxwb2x5Z29uIHBvaW50cz0iMTMwLDIwIDE1MCwyMCAxNDAsNSIgZmlsbD0iI2U3NGMzYyIvPicgKw0KICAgICAgICAg\"+\"ICAgICAgICc8cmVjdCB4PSI0MCIgeT0iMTEwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjgiIGZpbGw9IiM4ODgiIHJ4PSIyIi8+JyArDQogICAgICAgICAgICAgICAgJzx0ZXh0IHg9IjEwMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjMWE1Mjc2Ij5Db2x1bW4gQnVja2xpbmc8L3RleHQ+PC9zdmc+JzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDIwMCAxNDAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMTQwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicgKw0KICAgICAgICAgICAgJzxyZWN0IHg9Ijc1IiB5PSIzNSIgd2lkdGg9IjUwIiBoZWlnaHQ9IjcwIiBmaWxsPSIjYmRjM2M3IiBzdHJva2U9IiM1NTUiIHN0cm9rZS13aWR0aD0iMiIvPicgKw0KICAgICAgICAgICAgJzxsaW5lIHgxPSI2MCIgeTE9IjIwIiB4Mj0iMTQwIiB5Mj0iMjAiIHN0cm9rZT0iI2U3NGMzYyIgc3Ryb2tlLXdpZHRoPSIzIiBtYXJrZXItZW5kPSJ1cmwoI2FycikiLz4nICsNCiAgICAgICAgICAgICc8bGluZSB4MT0iNjAiIHkxPSIxMjAiIHgyPSIxNDAiIHkyPSIxMjAiIHN0cm9rZT0iI2U3NGMzYyIgc3Ryb2tlLXdpZHRoPSIzIi8+JyArDQogICAgICAgICAgICAnPHBvbHlnb24gcG9pbnRzPSI1NSwyMCA2NSwyMCA2MCw4IiBmaWxsPSIjZTc0YzNjIi8+JyArDQogICAgICAgICAgICAnPHBvbHlnb24gcG9pbnRzPSIxMzUsMTIwIDE0NSwxMjAgMTQwLDEzMiIgZmlsbD0iI2U3NGMzYyIvPicgKw0KICAgICAgICAgICAgJzxkZWZzPjxtYXJrZXIgaWQ9ImFyciIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iMyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4nICsNCiAgICAgICAgICAgICc8cG9seWdvbiBwb2ludHM9IjAsMCA2LDMgMCw2IiBmaWxsPSIjZTc0YzNjIi8+PC9tYXJrZXI+PC9kZWZzPicgKw0KICAgICAgICAgICAgJzx0ZXh0IHg9IjEwMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjExIiBmaWxsPSIjMWE1Mjc2Ij5BeGlhbCBDb21wcmVzc2lvbjwvdGV4dD48L3N2Zz4nOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdTZWN0aW9uU1ZHKHR5cGUpIHsNCiAgICAgICAgaWYgKHR5cGUgPT09ICdzb2xpZF9yb3VuZCcpIHsNCiAgICAgICAgICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiPjxjaXJjbGUgY3g9IjYwIiBjeT0iNjAiIHI9IjQ1IiBmaWxsPSIjZDVkYmRiIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIvPicgKw0KICAgICAgICAgICAgICAgICc8dGV4dCB4PSI2MCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNTU1Ij5Tb2xpZCBSb3VuZDwvdGV4dD48L3N2Zz4nOw0KICAgICAgICB9DQogICAgICAgIGlmICh0eXBlID09PSAnaG9sbG93X3JvdW5kJykgew0KICAgICAg\"+\"ICAgICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCI+PGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFhNTI3NiIgc3Ryb2tlLXdpZHRoPSIyIi8+JyArDQogICAgICAgICAgICAgICAgJzxjaXJjbGUgY3g9IjYwIiBjeT0iNjAiIHI9IjI4IiBmaWxsPSIjZjRmN2ZhIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIvPicgKw0KICAgICAgICAgICAgICAgICc8dGV4dCB4PSI2MCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNTU1Ij5Ib2xsb3cgUm91bmQ8L3RleHQ+PC9zdmc+JzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodHlwZSA9PT0gJ3JlY3RhbmdsZScpIHsNCiAgICAgICAgICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiPjxyZWN0IHg9IjIwIiB5PSIzNSIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUwIiBmaWxsPSIjZDVkYmRiIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIvPicgKw0KICAgICAgICAgICAgICAgICc8dGV4dCB4PSI2MCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNTU1Ij5SZWN0YW5nbGU8L3RleHQ+PC9zdmc+JzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodHlwZSA9PT0gJ3NxdWFyZScpIHsNCiAgICAgICAgICAgIHJldHVybiAnPHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiPjxyZWN0IHg9IjI1IiB5PSIyNSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjcwIiBmaWxsPSIjZDVkYmRiIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIvPicgKw0KICAgICAgICAgICAgICAgICc8dGV4dCB4PSI2MCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNTU1Ij5TcXVhcmU8L3RleHQ+PC9zdmc+JzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJzxzdmcgdmlld0JveD0iMCAwIDEyMCAxMjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIj48cmVjdCB4PSIyNSIgeT0iMzUiIHdpZHRoPSI3MCIgaGVpZ2h0PSI1MCIgZmlsbD0iI2Q1ZGJkYiIgc3Ryb2tlPSIjMWE1Mjc2IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYsMyIvPicgKw0KICAgICAgICAgICAgJzx0ZXh0IHg9IjYwIiB5PSIxMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM1NTUiPkN1c3RvbSBBcmVhPC90ZXh0Pjwvc3ZnPic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2V0UmVzdWx0SXRlbShpdGVtSWQsIHZhbHVlRWwsIHRleHQpIHsNCiAgICAgICAgY29uc3QgaXRlbSA9IHJvb3QucXVlcnlTZWxlY3RvcignI2NzYy0nICsgaXRlbUlkKTsNCiAgICAgICAgaWYgKGl0ZW0pIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnY3NjLWhp\"+\"ZGRlbicpOw0KICAgICAgICB2YWx1ZUVsLnRleHRDb250ZW50ID0gdGV4dDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0SXRlbShpdGVtSWQpIHsNCiAgICAgICAgY29uc3QgaXRlbSA9IHJvb3QucXVlcnlTZWxlY3RvcignI2NzYy0nICsgaXRlbUlkKTsNCiAgICAgICAgaWYgKGl0ZW0pIGl0ZW0uY2xhc3NMaXN0LmFkZCgnY3NjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dXYXJuaW5ncyhpdGVtcykgew0KICAgICAgICBpZiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgZWxzLndhcm5pbmdzLmhpZGRlbiA9IHRydWU7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgZWxzLndhcm5pbmdzLmhpZGRlbiA9IGZhbHNlOw0KICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gaXRlbXMubWFwKGZ1bmN0aW9uICh3KSB7DQogICAgICAgICAgICBjb25zdCBjbHMgPSB3LnR5cGUgPT09ICdlcnJvcicgPyAnY3NjLXdhcm5pbmctZXJyb3InIDogdy50eXBlID09PSAnd2FybicgPyAnY3NjLXdhcm5pbmctd2FybicgOiAnY3NjLXdhcm5pbmctaW5mbyc7DQogICAgICAgICAgICBjb25zdCBpY29uID0gdy50eXBlID09PSAnZXJyb3InID8gJyEnIDogdy50eXBlID09PSAnd2FybicgPyAnKicgOiAnaSc7DQogICAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImNzYy13YXJuaW5nICcgKyBjbHMgKyAnIj48c3Bhbj4nICsgaWNvbiArICc8L3NwYW4+PHNwYW4+JyArIHcubXNnICsgJzwvc3Bhbj48L2Rpdj4nOw0KICAgICAgICB9KS5qb2luKCcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVjb21tZW5kYXRpb25zKHJlY3MpIHsNCiAgICAgICAgaWYgKCFyZWNzIHx8IHJlY3MubGVuZ3RoID09PSAwKSB7DQogICAgICAgICAgICBlbHMucmVjb21tZW5kYXRpb25zLmhpZGRlbiA9IHRydWU7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9ucy5oaWRkZW4gPSBmYWxzZTsNCiAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9uc0xpc3QuaW5uZXJIVE1MID0gcmVjcy5tYXAoZnVuY3Rpb24gKHIpIHsgcmV0dXJuICc8bGk+JyArIHIgKyAnPC9saT4nOyB9KS5qb2luKCcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0c1BhbmVsKCkgew0KICAgICAgICBpZiAoZWxzLnJlc3VsdHNQYW5lbCkgZWxzLnJlc3VsdHNQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdjc2MtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29udmVydFZhbHVlc09uVW5pdENoYW5nZShuZXdTeXN0ZW0pIHsNCiAgICAgICAgY29uc3Qgb2xkU3lzdGVtID0gbmV3U3lzdGVtID09PSAnbWV0cmljJyA\/ICdpbXBlcmlhbCcgOiAnbWV0cmljJzsNCiAgICAgICAgY29uc3Qgb2xkVSA9IFVOSVRTW29sZFN5c3RlbV07DQogICAgICAg\"+\"IGNvbnN0IG5ld1UgPSBVTklUU1tuZXdTeXN0ZW1dOw0KDQogICAgICAgIFsnY29tcHJlc3NpdmVTdHJlbmd0aCcsICd5aWVsZFN0cmVuZ3RoJ10uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsNCiAgICAgICAgICAgIGNvbnN0IHYgPSBudW0oaWQpOw0KICAgICAgICAgICAgaWYgKHYgPiAwKSBlbHNbaWRdLnZhbHVlID0gZm10KG5ld1Uuc3RyZXNzVG9EaXNwbGF5KG9sZFUuc3RyZXNzRnJvbUlucHV0KHYpKSwgMik7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChudW0oJ3lvdW5nc01vZHVsdXMnKSA+IDApIHsNCiAgICAgICAgICAgIGVscy55b3VuZ3NNb2R1bHVzLnZhbHVlID0gZm10KG5ld1UubW9kdWx1c1RvRGlzcGxheShvbGRVLm1vZHVsdXNGcm9tSW5wdXQobnVtKCd5b3VuZ3NNb2R1bHVzJykpKSwgMik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobnVtKCdhcHBsaWVkTG9hZCcpICE9PSAwKSB7DQogICAgICAgICAgICBlbHMuYXBwbGllZExvYWQudmFsdWUgPSBmbXQobmV3VS5mb3JjZVRvRGlzcGxheShvbGRVLmZvcmNlRnJvbUlucHV0KG51bSgnYXBwbGllZExvYWQnKSkpLCAzKTsNCiAgICAgICAgfQ0KDQogICAgICAgIFsnZGlhbWV0ZXInLCAnb3V0ZXJEaWFtZXRlcicsICdpbm5lckRpYW1ldGVyJywgJ3dpZHRoJywgJ3RoaWNrbmVzcycsICdzcXVhcmVTaWRlJywgJ2NvbHVtbkxlbmd0aCddLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7DQogICAgICAgICAgICBjb25zdCB2ID0gbnVtKGlkKTsNCiAgICAgICAgICAgIGlmICh2ID4gMCkgew0KICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gJ2NvbHVtbkxlbmd0aCcpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxzW2lkXS52YWx1ZSA9IGZtdChuZXdVLmNvbExlbmd0aFRvRGlzcGxheShvbGRVLmNvbExlbmd0aEZyb21JbnB1dCh2KSksIDMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVsc1tpZF0udmFsdWUgPSBmbXQobmV3VS5sZW5ndGhUb0Rpc3BsYXkob2xkVS5sZW5ndGhGcm9tSW5wdXQodikpLCAzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChudW0oJ2N1c3RvbUFyZWEnKSA+IDApIHsNCiAgICAgICAgICAgIGVscy5jdXN0b21BcmVhLnZhbHVlID0gZm10KG5ld1UuYXJlYVRvRGlzcGxheShvbGRVLmFyZWFGcm9tSW5wdXQobnVtKCdjdXN0b21BcmVhJykpKSwgMik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobnVtKCdtb21lbnRPZkluZXJ0aWEnKSA+IDApIHsNCiAgICAgICAgICAgIGVscy5tb21lbnRPZkluZXJ0aWEudmFsdWUgPSBmbXQobmV3VS5pbmVydGlhVG9EaXNwbGF5KG9sZFUuaW5lcnRpYUZyb21JbnB1dChudW0oJ21vbWVudE9mSW5lcnRpYScpKSksIDIpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgICAgZWxzLmNhbGN1bGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNh\"+\"bGN1bGF0ZSk7DQogICAgICAgIGVscy5tYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhcHBseU1hdGVyaWFsUHJlc2V0KTsNCg0KICAgICAgICBlbHMudW5pdFN5c3RlbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBjb252ZXJ0VmFsdWVzT25Vbml0Q2hhbmdlKGVscy51bml0U3lzdGVtLnZhbHVlKTsNCiAgICAgICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgWydjYWxjTW9kZScsICdzZWN0aW9uVHlwZScsICdlbmRDb25kaXRpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgew0KICAgICAgICAgICAgZWxzW2lkXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVGaWVsZFZpc2liaWxpdHkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuZW5hYmxlQnVja2xpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRmllbGRWaXNpYmlsaXR5KTsNCg0KICAgICAgICBlbHMuZW5kQ29uZGl0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmIChlbHMuZW5kQ29uZGl0aW9uLnZhbHVlICE9PSAnY3VzdG9tJykgew0KICAgICAgICAgICAgICAgIGVscy5lZmZlY3RpdmVMZW5ndGhGYWN0b3IudmFsdWUgPSBlbHMuZW5kQ29uZGl0aW9uLnZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaXQoKSB7DQogICAgICAgIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3NjLWNhbGN1bGF0b3InKTsNCiAgICAgICAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLWNzYy1yZWFkeScpID09PSAnMScpIHJldHVybjsNCiAgICAgICAgaWYgKCFjYWNoZUVsZW1lbnRzKCkpIHJldHVybjsNCiAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3NjLXJlYWR5JywgJzEnKTsNCiAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldCgpOw0KICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7DQogICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICBiaW5kRXZlbnRzKCk7DQogICAgfQ0KDQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaW5pdCgpOw0KICAgIH0NCg0KICAgIHdpbmRvdy5DU0NJbml0ID0gaW5pdDsNCn0pKCk7DQo=\";\n  var c=\"\";\n  try{c=atob(b);}catch(e1){return;}\n  var s=document.createElement(\"script\");\n  s.type=\"text\/javascript\";\n  s.text=c;\n  document.head.appendChild(s);\n})();\n<\/script>\n\n<!-- Option B: replace YOUR-SITE-URL with your uploaded app.js URL\n<script type=\"text\/javascript\" src=\"YOUR-SITE-URL\/wp-content\/uploads\/app.js\"><\/script>\n-->\n","protected":false},"excerpt":{"rendered":"<p>The Compressive Strength Calculator is a practical engineering tool designed to calculate compressive stress, allowable compressive load, required cross-sectional area, safety factor, and compression utilization&#8230;<\/p>","protected":false},"author":2,"featured_media":24801,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8671,8670,8531,8536],"class_list":["post-24800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-compression-stress","tag-compressive-strength","tag-load-capacity","tag-safety-factor","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Compressive-Strength-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/comments?post=24800"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24800\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/24801"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=24800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=24800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=24800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}