UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

142 lines 24.8 kB
export const DOMAIN_PATTERN_BASE = '^([\\da-z.-]+)\\.([a-z.]+)$'; export const IP_PATTERN_BASE = '^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})$'; export const IPV6_PATTERN_BASE = '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9]).){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9]).){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$'; const PROTOCOL_PATTERN_BASE = 'https?://'; const PORT_PATTERN_BASE = '(:(6553[0-5]|655[0-2]\\d|65[0-4]\\d\\d|6[0-4]\\d\\d\\d|[1-5]\\d\\d\\d\\d|[1-9]\\d\\d\\d|[1-9]\\d\\d|[1-9]\\d|[1-9]))'; const addPortAndProtocol = (patternStr) => { const main = patternStr.replace(/(^\^)?/, '').replace(/(\$?)$/, ''); return `^(${PROTOCOL_PATTERN_BASE})?${main}(${PORT_PATTERN_BASE})?$`; }; const addPortAndProtocolForIpv6 = (patternStr) => { const main = patternStr.replace(/(^\^)?/, '').replace(/(\$?)$/, ''); return `(${patternStr})|(^(${PROTOCOL_PATTERN_BASE})\\[${main}\\]$)|(^(${PROTOCOL_PATTERN_BASE})?\\[${main}\\](${PORT_PATTERN_BASE})$)`; }; export const PORT_PATTERN = { pattern: /(^[1-9]\d{0,3}$)|(^[1-5]\d{4}$)|^(6[0-4]\d{3}$)|(^65[0-4]\d{2}$)|(^655[0-2]\d$)|(^6553[0-5]$)/, tip: 'invalid_port', }; // include ipv4, domain export const IP_ADDRESS_HOSTNAME_PATTERN = { pattern: new RegExp(`(${IP_PATTERN_BASE})|(${DOMAIN_PATTERN_BASE})`), tip: 'regexp_tip_ip_address_or_hostname', }; // include ipv6, domain export const IPV6_ADDRESS_HOSTNAME_PATTERN = { pattern: new RegExp(`(${IPV6_PATTERN_BASE})|(${DOMAIN_PATTERN_BASE})`), tip: 'regexp_tip_ipv6_address_or_hostname', }; // include ipv4, domain, and support port and protocol export const IP_ADDRESS_HOSTNAME_PORT_PATTERN = { pattern: new RegExp(`(${addPortAndProtocol(IP_PATTERN_BASE)})|(${addPortAndProtocol(DOMAIN_PATTERN_BASE)})`), tip: 'regexp_tip_ip_address_or_hostname', }; // include ipv6, domain, and support port and protocol export const IPV6_ADDRESS_HOSTNAME_PORT_PATTERN = { pattern: new RegExp(`(${addPortAndProtocolForIpv6(IPV6_PATTERN_BASE)})|(${addPortAndProtocol(DOMAIN_PATTERN_BASE)})`), tip: 'regexp_tip_ipv6_address_or_hostname', }; // include ipv4, ipv6, domain, and support port and protocol export const IPV4_IPV6_ADDRESS_HOSTNAME_PORT_PATTERN = { pattern: new RegExp(`(${addPortAndProtocol(IP_PATTERN_BASE)})|(${addPortAndProtocolForIpv6(IPV6_PATTERN_BASE)})|(${addPortAndProtocol(DOMAIN_PATTERN_BASE)})`), tip: 'regexp_tip_ipv4_ipv6_address_or_hostname', }; // include ipv4, ipv6, domain export const IP_ADDRESS_HOSTNAME_PATTERN_EXTEND = { pattern: new RegExp(`(${IP_PATTERN_BASE})|(${DOMAIN_PATTERN_BASE})|(${IPV6_PATTERN_BASE})`), tip: 'regexp_tip_ip_address_or_hostname', }; export const IP_ADDRESS_SUBNET_PATTERN = { pattern: /^((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\/\d+$/, tip: 'regexp_tip_ip_address_with_subnet', }; export const DOMAIN_PATTERN = { pattern: new RegExp(DOMAIN_PATTERN_BASE), placeholder: 'domain_regexp_placeholder', tip: 'domain_regexp_tip', }; export const IP_ADDRESS_PATTERN = { pattern: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})$/, placeholder: 'ip_address_placeholder', tip: 'regexp_tip_ip_address', }; export const IP_PATTERN = { pattern: /^((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})){3}$/, tip: 'invalid_ip', }; export const IP_V6_PATTERN = { pattern: new RegExp(`${IPV6_PATTERN_BASE}`), tip: 'invalid_ip', }; export const IP_V6_ADDRESS_PATTERN = { pattern: new RegExp(IPV6_PATTERN_BASE), }; export const IP_V4_OR_V6_PATTERN = { pattern: new RegExp(`(${IP_PATTERN_BASE})|(${IPV6_PATTERN_BASE})`), }; export const IP_ADDRESS_PORT_PATTERN = { pattern: new RegExp(`${IP_PATTERN_BASE.slice(0, -1)}(?::\\d+)?$`), tip: 'regexp_tip_ip_address', }; export const INT_ZERO_PATTERN = { pattern: /^(0|\+?[1-9]\d*)$/, tip: 'regexp_tip_positive_integer_pattern_zero', }; export const POSITIVE_INT_PATTERN = { pattern: /^[1-9]\d*$/, tip: 'regexp_tip_positive_integer_pattern', }; export const POSITIVE_NUMBER_PATTERN = { pattern: /^([1-9]\d*(?:\.\d*)?|0*\.0*[1-9]\d*)$/, tip: 'regexp_tip_positive_number_pattern', }; export const K8S_RESOURCE_NAME_BASE = { pattern: /^[\da-z]([\da-z-]*[\da-z])?$/, tip: 'regexp_tip_k8s_resource_name_base', }; export const K8S_RESOURCE_LABEL_KEY_PREFIX_PATTERN = { pattern: /^[\da-z]([\da-z-]*[\da-z])?(\.[\da-z]([\da-z-]*[\da-z])?)*$/, tip: 'regexp_tip_resource_label_key_prefix', }; // 不能直接用来校验 label key,需要使用 `k8sResourceLabelKeyValidator` export const K8S_RESOURCE_LABEL_KEY_NAME_PATTERN = { pattern: /^(([\dA-Za-z][\w.-]*)?[\dA-Za-z])$/, tip: 'k8s_resource_label_key_invalid', }; export const K8S_RESOURCE_LABEL_VALUE_PATTERN = { pattern: /^(([\dA-Za-z][\w.-]*)?[\dA-Za-z])?$/, tip: 'k8s_resource_label_value_invalid', }; export const K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY = { pattern: /^[a-z]([\da-z-]*[\da-z])?$/, tip: 'regexp_tip_k8s_resource_name_start_with_chars_only', }; export const HTTP_IP_OR_DOMAIN_PATTERN = { pattern: /^((http|https):\/\/)((((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})){3})|((([\dA-Za-z-]*[\dA-Za-z])\.)*([A-Za-z]|[A-Za-z][\dA-Za-z-]*[\dA-Za-z])))(:(([1-9]\d{0,3})|([1-5]\d{4})|(6[0-4]\d{3})|(65[0-4]\d{2})|(655[0-2]\d)|(6553[0-5])))?(\/\S*)*$/, tip: 'domain_ip_placeholder', }; export const HTTP_DUAL_IP_OR_DOMAIN_PATTERN = { pattern: /^((http|https):\/\/)((((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[01]?\d{1,2})){3})|((([\dA-Za-z-]*[\dA-Za-z])\.)*([A-Za-z]|[A-Za-z][\dA-Za-z-]*[\dA-Za-z]))|(\[((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:)(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\]))(:(([1-9]\d{0,3})|([1-5]\d{4})|(6[0-4]\d{3})|(65[0-4]\d{2})|(655[0-2]\d)|(6553[0-5])))?(\/\S*)*$/, tip: 'domain_ip_placeholder', }; export const HTTP_ADDRESS_PATTERN = { pattern: /^(http|https):\/\/([\w.])\S*$/, tip: 'http_address_format_limit', }; export const EMAIL_PATTERN = { pattern: /^[\w.-]+@[\w-]+(\.[\w-]+)+$/, tip: 'invalid_email', }; export const IMAGE_TAG_PATTERN = { pattern: /^((sha256:[\da-f]{6,64})|(\w[\w.-]{0,127}))$/, tip: 'regexp_tip_image_tag', placeholder: 'image_tag_input_placeholder', }; export const INT_PATTERN = { pattern: /^-?\d+$/, tip: 'regexp_tip_integer_pattern', }; export const NUMBER_PATTERN = { pattern: /^-?\d+(\.\d*)?$/, tip: 'invalid_number', }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS9jb25zdGFudHMvcGF0dGVybnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsNkJBQTZCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUMxQixvRkFBb0YsQ0FBQztBQUV2RixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FDNUIsb21CQUFvbUIsQ0FBQztBQUV2bUIsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUM7QUFDMUMsTUFBTSxpQkFBaUIsR0FDckIsc0hBQXNILENBQUM7QUFFekgsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsRUFBRTtJQUNoRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxxQkFBcUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLEtBQUssQ0FBQztBQUN2RSxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxJQUFJLFVBQVUsUUFBUSxxQkFBcUIsT0FBTyxJQUFJLFlBQVkscUJBQXFCLFFBQVEsSUFBSSxPQUFPLGlCQUFpQixLQUFLLENBQUM7QUFDMUksQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLE9BQU8sRUFDTCwrRkFBK0Y7SUFDakcsR0FBRyxFQUFFLGNBQWM7Q0FDcEIsQ0FBQztBQUVGLHVCQUF1QjtBQUN2QixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQztJQUNwRSxHQUFHLEVBQUUsbUNBQW1DO0NBQ3pDLENBQUM7QUFFRix1QkFBdUI7QUFDdkIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksaUJBQWlCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQztJQUN0RSxHQUFHLEVBQUUscUNBQXFDO0NBQzNDLENBQUM7QUFFRixzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUc7SUFDOUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUNqQixJQUFJLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxNQUFNLGtCQUFrQixDQUM3RCxtQkFBbUIsQ0FDcEIsR0FBRyxDQUNMO0lBQ0QsR0FBRyxFQUFFLG1DQUFtQztDQUN6QyxDQUFDO0FBRUYsc0RBQXNEO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHO0lBQ2hELE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FDakIsSUFBSSx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLGtCQUFrQixDQUN0RSxtQkFBbUIsQ0FDcEIsR0FBRyxDQUNMO0lBQ0QsR0FBRyxFQUFFLHFDQUFxQztDQUMzQyxDQUFDO0FBRUYsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHO0lBQ3JELE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FDakIsSUFBSSxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsTUFBTSx5QkFBeUIsQ0FDcEUsaUJBQWlCLENBQ2xCLE1BQU0sa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUNsRDtJQUNELEdBQUcsRUFBRSwwQ0FBMEM7Q0FDaEQsQ0FBQztBQUVGLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRztJQUNoRCxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQ2pCLElBQUksZUFBZSxNQUFNLG1CQUFtQixNQUFNLGlCQUFpQixHQUFHLENBQ3ZFO0lBQ0QsR0FBRyxFQUFFLG1DQUFtQztDQUN6QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsT0FBTyxFQUNMLHdGQUF3RjtJQUMxRixHQUFHLEVBQUUsbUNBQW1DO0NBQ3pDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDO0lBQ3hDLFdBQVcsRUFBRSwyQkFBMkI7SUFDeEMsR0FBRyxFQUFFLG1CQUFtQjtDQUN6QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsT0FBTyxFQUNMLCtFQUErRTtJQUNqRixXQUFXLEVBQUUsd0JBQXdCO0lBQ3JDLEdBQUcsRUFBRSx1QkFBdUI7Q0FDN0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixPQUFPLEVBQ0wsK0VBQStFO0lBQ2pGLEdBQUcsRUFBRSxZQUFZO0NBQ2xCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUc7SUFDM0IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxHQUFHLEVBQUUsWUFBWTtDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDO0NBQ3ZDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0saUJBQWlCLEdBQUcsQ0FBQztDQUNuRSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ2pFLEdBQUcsRUFBRSx1QkFBdUI7Q0FDN0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLE9BQU8sRUFBRSxtQkFBbUI7SUFDNUIsR0FBRyxFQUFFLDBDQUEwQztDQUNoRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsT0FBTyxFQUFFLFlBQVk7SUFDckIsR0FBRyxFQUFFLHFDQUFxQztDQUMzQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUFFLHVDQUF1QztJQUNoRCxHQUFHLEVBQUUsb0NBQW9DO0NBQzFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRztJQUNwQyxPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDLEdBQUcsRUFBRSxtQ0FBbUM7Q0FDekMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHO0lBQ25ELE9BQU8sRUFBRSw2REFBNkQ7SUFDdEUsR0FBRyxFQUFFLHNDQUFzQztDQUM1QyxDQUFDO0FBRUYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHO0lBQ2pELE9BQU8sRUFBRSxvQ0FBb0M7SUFDN0MsR0FBRyxFQUFFLGdDQUFnQztDQUN0QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUc7SUFDOUMsT0FBTyxFQUFFLHFDQUFxQztJQUM5QyxHQUFHLEVBQUUsa0NBQWtDO0NBQ3hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRztJQUNyRCxPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLEdBQUcsRUFBRSxvREFBb0Q7Q0FDMUQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLE9BQU8sRUFDTCw4UUFBOFE7SUFDaFIsR0FBRyxFQUFFLHVCQUF1QjtDQUM3QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7SUFDNUMsT0FBTyxFQUNMLGkwQ0FBaTBDO0lBQ24wQyxHQUFHLEVBQUUsdUJBQXVCO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixPQUFPLEVBQUUsNkJBQTZCO0lBQ3RDLEdBQUcsRUFBRSxlQUFlO0NBQ3JCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixPQUFPLEVBQUUsOENBQThDO0lBQ3ZELEdBQUcsRUFBRSxzQkFBc0I7SUFDM0IsV0FBVyxFQUFFLDZCQUE2QjtDQUMzQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEdBQUcsRUFBRSw0QkFBNEI7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM1QixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLEdBQUcsRUFBRSxnQkFBZ0I7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBET01BSU5fUEFUVEVSTl9CQVNFID0gJ14oW1xcXFxkYS16Li1dKylcXFxcLihbYS16Ll0rKSQnO1xuXG5leHBvcnQgY29uc3QgSVBfUEFUVEVSTl9CQVNFID1cbiAgJ14oPzooPzoyNVswLTVdfDJbMC00XVxcXFxkfFswMV0/XFxcXGR7MSwyfSlcXFxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcXFxkfFswMV0/XFxcXGR7MSwyfSkkJztcblxuZXhwb3J0IGNvbnN0IElQVjZfUEFUVEVSTl9CQVNFID1cbiAgJ14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXSt8OjooZmZmZig6MHsxLDR9KT86KT8oKDI1WzAtNV18KDJbMC00XXwxP1swLTldKT9bMC05XSkuKXszfSgyNVswLTVdfCgyWzAtNF18MT9bMC05XSk/WzAtOV0pfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxP1swLTldKT9bMC05XSkuKXszfSgyNVswLTVdfCgyWzAtNF18MT9bMC05XSk/WzAtOV0pKSQnO1xuXG5jb25zdCBQUk9UT0NPTF9QQVRURVJOX0JBU0UgPSAnaHR0cHM/Oi8vJztcbmNvbnN0IFBPUlRfUEFUVEVSTl9CQVNFID1cbiAgJyg6KDY1NTNbMC01XXw2NTVbMC0yXVxcXFxkfDY1WzAtNF1cXFxcZFxcXFxkfDZbMC00XVxcXFxkXFxcXGRcXFxcZHxbMS01XVxcXFxkXFxcXGRcXFxcZFxcXFxkfFsxLTldXFxcXGRcXFxcZFxcXFxkfFsxLTldXFxcXGRcXFxcZHxbMS05XVxcXFxkfFsxLTldKSknO1xuXG5jb25zdCBhZGRQb3J0QW5kUHJvdG9jb2wgPSAocGF0dGVyblN0cjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1haW4gPSBwYXR0ZXJuU3RyLnJlcGxhY2UoLyheXFxeKT8vLCAnJykucmVwbGFjZSgvKFxcJD8pJC8sICcnKTtcbiAgcmV0dXJuIGBeKCR7UFJPVE9DT0xfUEFUVEVSTl9CQVNFfSk/JHttYWlufSgke1BPUlRfUEFUVEVSTl9CQVNFfSk/JGA7XG59O1xuXG5jb25zdCBhZGRQb3J0QW5kUHJvdG9jb2xGb3JJcHY2ID0gKHBhdHRlcm5TdHI6IHN0cmluZykgPT4ge1xuICBjb25zdCBtYWluID0gcGF0dGVyblN0ci5yZXBsYWNlKC8oXlxcXik/LywgJycpLnJlcGxhY2UoLyhcXCQ/KSQvLCAnJyk7XG4gIHJldHVybiBgKCR7cGF0dGVyblN0cn0pfCheKCR7UFJPVE9DT0xfUEFUVEVSTl9CQVNFfSlcXFxcWyR7bWFpbn1cXFxcXSQpfCheKCR7UFJPVE9DT0xfUEFUVEVSTl9CQVNFfSk/XFxcXFske21haW59XFxcXF0oJHtQT1JUX1BBVFRFUk5fQkFTRX0pJClgO1xufTtcblxuZXhwb3J0IGNvbnN0IFBPUlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjpcbiAgICAvKF5bMS05XVxcZHswLDN9JCl8KF5bMS01XVxcZHs0fSQpfF4oNlswLTRdXFxkezN9JCl8KF42NVswLTRdXFxkezJ9JCl8KF42NTVbMC0yXVxcZCQpfCheNjU1M1swLTVdJCkvLFxuICB0aXA6ICdpbnZhbGlkX3BvcnQnLFxufTtcblxuLy8gaW5jbHVkZSBpcHY0LCBkb21haW5cbmV4cG9ydCBjb25zdCBJUF9BRERSRVNTX0hPU1ROQU1FX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoYCgke0lQX1BBVFRFUk5fQkFTRX0pfCgke0RPTUFJTl9QQVRURVJOX0JBU0V9KWApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3Nfb3JfaG9zdG5hbWUnLFxufTtcblxuLy8gaW5jbHVkZSBpcHY2LCBkb21haW5cbmV4cG9ydCBjb25zdCBJUFY2X0FERFJFU1NfSE9TVE5BTUVfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogbmV3IFJlZ0V4cChgKCR7SVBWNl9QQVRURVJOX0JBU0V9KXwoJHtET01BSU5fUEFUVEVSTl9CQVNFfSlgKSxcbiAgdGlwOiAncmVnZXhwX3RpcF9pcHY2X2FkZHJlc3Nfb3JfaG9zdG5hbWUnLFxufTtcblxuLy8gaW5jbHVkZSBpcHY0LCBkb21haW4sIGFuZCBzdXBwb3J0IHBvcnQgYW5kIHByb3RvY29sXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19IT1NUTkFNRV9QT1JUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoXG4gICAgYCgke2FkZFBvcnRBbmRQcm90b2NvbChJUF9QQVRURVJOX0JBU0UpfSl8KCR7YWRkUG9ydEFuZFByb3RvY29sKFxuICAgICAgRE9NQUlOX1BBVFRFUk5fQkFTRSxcbiAgICApfSlgLFxuICApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3Nfb3JfaG9zdG5hbWUnLFxufTtcblxuLy8gaW5jbHVkZSBpcHY2LCBkb21haW4sIGFuZCBzdXBwb3J0IHBvcnQgYW5kIHByb3RvY29sXG5leHBvcnQgY29uc3QgSVBWNl9BRERSRVNTX0hPU1ROQU1FX1BPUlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogbmV3IFJlZ0V4cChcbiAgICBgKCR7YWRkUG9ydEFuZFByb3RvY29sRm9ySXB2NihJUFY2X1BBVFRFUk5fQkFTRSl9KXwoJHthZGRQb3J0QW5kUHJvdG9jb2woXG4gICAgICBET01BSU5fUEFUVEVSTl9CQVNFLFxuICAgICl9KWAsXG4gICksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXB2Nl9hZGRyZXNzX29yX2hvc3RuYW1lJyxcbn07XG5cbi8vIGluY2x1ZGUgIGlwdjQsIGlwdjYsIGRvbWFpbiwgYW5kIHN1cHBvcnQgcG9ydCBhbmQgcHJvdG9jb2xcbmV4cG9ydCBjb25zdCBJUFY0X0lQVjZfQUREUkVTU19IT1NUTkFNRV9QT1JUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoXG4gICAgYCgke2FkZFBvcnRBbmRQcm90b2NvbChJUF9QQVRURVJOX0JBU0UpfSl8KCR7YWRkUG9ydEFuZFByb3RvY29sRm9ySXB2NihcbiAgICAgIElQVjZfUEFUVEVSTl9CQVNFLFxuICAgICl9KXwoJHthZGRQb3J0QW5kUHJvdG9jb2woRE9NQUlOX1BBVFRFUk5fQkFTRSl9KWAsXG4gICksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXB2NF9pcHY2X2FkZHJlc3Nfb3JfaG9zdG5hbWUnLFxufTtcblxuLy8gaW5jbHVkZSBpcHY0LCBpcHY2LCBkb21haW5cbmV4cG9ydCBjb25zdCBJUF9BRERSRVNTX0hPU1ROQU1FX1BBVFRFUk5fRVhURU5EID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKFxuICAgIGAoJHtJUF9QQVRURVJOX0JBU0V9KXwoJHtET01BSU5fUEFUVEVSTl9CQVNFfSl8KCR7SVBWNl9QQVRURVJOX0JBU0V9KWAsXG4gICksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXBfYWRkcmVzc19vcl9ob3N0bmFtZScsXG59O1xuXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19TVUJORVRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjpcbiAgICAvXigoXFxkfFsxLTldXFxkfDFcXGR7Mn18MlswLTRdXFxkfDI1WzAtNV0pXFwuKXszfShcXGR8WzEtOV1cXGR8MVxcZHsyfXwyWzAtNF1cXGR8MjVbMC01XSlcXC9cXGQrJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXBfYWRkcmVzc193aXRoX3N1Ym5ldCcsXG59O1xuXG5leHBvcnQgY29uc3QgRE9NQUlOX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoRE9NQUlOX1BBVFRFUk5fQkFTRSksXG4gIHBsYWNlaG9sZGVyOiAnZG9tYWluX3JlZ2V4cF9wbGFjZWhvbGRlcicsXG4gIHRpcDogJ2RvbWFpbl9yZWdleHBfdGlwJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9BRERSRVNTX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZHsxLDJ9KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZHsxLDJ9KSQvLFxuICBwbGFjZWhvbGRlcjogJ2lwX2FkZHJlc3NfcGxhY2Vob2xkZXInLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3MnLFxufTtcblxuZXhwb3J0IGNvbnN0IElQX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKDIoNVswLTVdfFswLTRdXFxkKSl8WzAxXT9cXGR7MSwyfSkoXFwuKCgyKDVbMC01XXxbMC00XVxcZCkpfFswMV0/XFxkezEsMn0pKXszfSQvLFxuICB0aXA6ICdpbnZhbGlkX2lwJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9WNl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKGAke0lQVjZfUEFUVEVSTl9CQVNFfWApLFxuICB0aXA6ICdpbnZhbGlkX2lwJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9WNl9BRERSRVNTX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoSVBWNl9QQVRURVJOX0JBU0UpLFxufTtcblxuZXhwb3J0IGNvbnN0IElQX1Y0X09SX1Y2X1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoYCgke0lQX1BBVFRFUk5fQkFTRX0pfCgke0lQVjZfUEFUVEVSTl9CQVNFfSlgKSxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9BRERSRVNTX1BPUlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogbmV3IFJlZ0V4cChgJHtJUF9QQVRURVJOX0JBU0Uuc2xpY2UoMCwgLTEpfSg/OjpcXFxcZCspPyRgKSxcbiAgdGlwOiAncmVnZXhwX3RpcF9pcF9hZGRyZXNzJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJTlRfWkVST19QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXigwfFxcKz9bMS05XVxcZCopJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfcG9zaXRpdmVfaW50ZWdlcl9wYXR0ZXJuX3plcm8nLFxufTtcblxuZXhwb3J0IGNvbnN0IFBPU0lUSVZFX0lOVF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXlsxLTldXFxkKiQvLFxuICB0aXA6ICdyZWdleHBfdGlwX3Bvc2l0aXZlX2ludGVnZXJfcGF0dGVybicsXG59O1xuXG5leHBvcnQgY29uc3QgUE9TSVRJVkVfTlVNQkVSX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eKFsxLTldXFxkKig/OlxcLlxcZCopP3wwKlxcLjAqWzEtOV1cXGQqKSQvLFxuICB0aXA6ICdyZWdleHBfdGlwX3Bvc2l0aXZlX251bWJlcl9wYXR0ZXJuJyxcbn07XG5cbmV4cG9ydCBjb25zdCBLOFNfUkVTT1VSQ0VfTkFNRV9CQVNFID0ge1xuICBwYXR0ZXJuOiAvXltcXGRhLXpdKFtcXGRhLXotXSpbXFxkYS16XSk/JC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX3Jlc291cmNlX25hbWVfYmFzZScsXG59O1xuXG5leHBvcnQgY29uc3QgSzhTX1JFU09VUkNFX0xBQkVMX0tFWV9QUkVGSVhfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL15bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPyhcXC5bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPykqJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfcmVzb3VyY2VfbGFiZWxfa2V5X3ByZWZpeCcsXG59O1xuXG4vLyDkuI3og73nm7TmjqXnlKjmnaXmoKHpqowgbGFiZWwga2V577yM6ZyA6KaB5L2/55SoIGBrOHNSZXNvdXJjZUxhYmVsS2V5VmFsaWRhdG9yYFxuZXhwb3J0IGNvbnN0IEs4U19SRVNPVVJDRV9MQUJFTF9LRVlfTkFNRV9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXigoW1xcZEEtWmEtel1bXFx3Li1dKik/W1xcZEEtWmEtel0pJC8sXG4gIHRpcDogJ2s4c19yZXNvdXJjZV9sYWJlbF9rZXlfaW52YWxpZCcsXG59O1xuXG5leHBvcnQgY29uc3QgSzhTX1JFU09VUkNFX0xBQkVMX1ZBTFVFX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eKChbXFxkQS1aYS16XVtcXHcuLV0qKT9bXFxkQS1aYS16XSk/JC8sXG4gIHRpcDogJ2s4c19yZXNvdXJjZV9sYWJlbF92YWx1ZV9pbnZhbGlkJyxcbn07XG5cbmV4cG9ydCBjb25zdCBLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFkgPSB7XG4gIHBhdHRlcm46IC9eW2Etel0oW1xcZGEtei1dKltcXGRhLXpdKT8kLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9rOHNfcmVzb3VyY2VfbmFtZV9zdGFydF93aXRoX2NoYXJzX29ubHknLFxufTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfSVBfT1JfRE9NQUlOX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKGh0dHB8aHR0cHMpOlxcL1xcLykoKCgoMig1WzAtNV18WzAtNF1cXGQpKXxbMDFdP1xcZHsxLDJ9KShcXC4oKDIoNVswLTVdfFswLTRdXFxkKSl8WzAxXT9cXGR7MSwyfSkpezN9KXwoKChbXFxkQS1aYS16LV0qW1xcZEEtWmEtel0pXFwuKSooW0EtWmEtel18W0EtWmEtel1bXFxkQS1aYS16LV0qW1xcZEEtWmEtel0pKSkoOigoWzEtOV1cXGR7MCwzfSl8KFsxLTVdXFxkezR9KXwoNlswLTRdXFxkezN9KXwoNjVbMC00XVxcZHsyfSl8KDY1NVswLTJdXFxkKXwoNjU1M1swLTVdKSkpPyhcXC9cXFMqKSokLyxcbiAgdGlwOiAnZG9tYWluX2lwX3BsYWNlaG9sZGVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBIVFRQX0RVQUxfSVBfT1JfRE9NQUlOX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKGh0dHB8aHR0cHMpOlxcL1xcLykoKCgoMig1WzAtNV18WzAtNF1cXGQpKXxbMDFdP1xcZHsxLDJ9KShcXC4oKDIoNVswLTVdfFswLTRdXFxkKSl8WzAxXT9cXGR7MSwyfSkpezN9KXwoKChbXFxkQS1aYS16LV0qW1xcZEEtWmEtel0pXFwuKSooW0EtWmEtel18W0EtWmEtel1bXFxkQS1aYS16LV0qW1xcZEEtWmEtel0pKXwoXFxbKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKCUuKyk/XFxdKSkoOigoWzEtOV1cXGR7MCwzfSl8KFsxLTVdXFxkezR9KXwoNlswLTRdXFxkezN9KXwoNjVbMC00XVxcZHsyfSl8KDY1NVswLTJdXFxkKXwoNjU1M1swLTVdKSkpPyhcXC9cXFMqKSokLyxcbiAgdGlwOiAnZG9tYWluX2lwX3BsYWNlaG9sZGVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBIVFRQX0FERFJFU1NfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14oaHR0cHxodHRwcyk6XFwvXFwvKFtcXHcuXSlcXFMqJC8sXG4gIHRpcDogJ2h0dHBfYWRkcmVzc19mb3JtYXRfbGltaXQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEVNQUlMX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eW1xcdy4tXStAW1xcdy1dKyhcXC5bXFx3LV0rKSskLyxcbiAgdGlwOiAnaW52YWxpZF9lbWFpbCcsXG59O1xuXG5leHBvcnQgY29uc3QgSU1BR0VfVEFHX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eKChzaGEyNTY6W1xcZGEtZl17Niw2NH0pfChcXHdbXFx3Li1dezAsMTI3fSkpJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfaW1hZ2VfdGFnJyxcbiAgcGxhY2Vob2xkZXI6ICdpbWFnZV90YWdfaW5wdXRfcGxhY2Vob2xkZXInLFxufTtcblxuZXhwb3J0IGNvbnN0IElOVF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXi0/XFxkKyQvLFxuICB0aXA6ICdyZWdleHBfdGlwX2ludGVnZXJfcGF0dGVybicsXG59O1xuXG5leHBvcnQgY29uc3QgTlVNQkVSX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eLT9cXGQrKFxcLlxcZCopPyQvLFxuICB0aXA6ICdpbnZhbGlkX251bWJlcicsXG59O1xuIl19