@alauda-fe/common
Version:
Alauda frontend team common codes.
142 lines • 24.9 kB
JavaScript
export const DOMAIN_PATTERN_BASE = '^([\\da-z.-]+)\\.([a-z.]{2,6})$';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS9jb25zdGFudHMvcGF0dGVybnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsaUNBQWlDLENBQUM7QUFFckUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUMxQixvRkFBb0YsQ0FBQztBQUV2RixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FDNUIsb21CQUFvbUIsQ0FBQztBQUV2bUIsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUM7QUFDMUMsTUFBTSxpQkFBaUIsR0FDckIsc0hBQXNILENBQUM7QUFFekgsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsRUFBRTtJQUNoRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxxQkFBcUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLEtBQUssQ0FBQztBQUN2RSxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxJQUFJLFVBQVUsUUFBUSxxQkFBcUIsT0FBTyxJQUFJLFlBQVkscUJBQXFCLFFBQVEsSUFBSSxPQUFPLGlCQUFpQixLQUFLLENBQUM7QUFDMUksQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLE9BQU8sRUFDTCwrRkFBK0Y7SUFDakcsR0FBRyxFQUFFLGNBQWM7Q0FDcEIsQ0FBQztBQUVGLHVCQUF1QjtBQUN2QixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQztJQUNwRSxHQUFHLEVBQUUsbUNBQW1DO0NBQ3pDLENBQUM7QUFFRix1QkFBdUI7QUFDdkIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksaUJBQWlCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQztJQUN0RSxHQUFHLEVBQUUscUNBQXFDO0NBQzNDLENBQUM7QUFFRixzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUc7SUFDOUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUNqQixJQUFJLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxNQUFNLGtCQUFrQixDQUM3RCxtQkFBbUIsQ0FDcEIsR0FBRyxDQUNMO0lBQ0QsR0FBRyxFQUFFLG1DQUFtQztDQUN6QyxDQUFDO0FBRUYsc0RBQXNEO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHO0lBQ2hELE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FDakIsSUFBSSx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLGtCQUFrQixDQUN0RSxtQkFBbUIsQ0FDcEIsR0FBRyxDQUNMO0lBQ0QsR0FBRyxFQUFFLHFDQUFxQztDQUMzQyxDQUFDO0FBRUYsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHO0lBQ3JELE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FDakIsSUFBSSxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsTUFBTSx5QkFBeUIsQ0FDcEUsaUJBQWlCLENBQ2xCLE1BQU0sa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUNsRDtJQUNELEdBQUcsRUFBRSwwQ0FBMEM7Q0FDaEQsQ0FBQztBQUVGLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRztJQUNoRCxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQ2pCLElBQUksZUFBZSxNQUFNLG1CQUFtQixNQUFNLGlCQUFpQixHQUFHLENBQ3ZFO0lBQ0QsR0FBRyxFQUFFLG1DQUFtQztDQUN6QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsT0FBTyxFQUNMLHdGQUF3RjtJQUMxRixHQUFHLEVBQUUsbUNBQW1DO0NBQ3pDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDO0lBQ3hDLFdBQVcsRUFBRSwyQkFBMkI7SUFDeEMsR0FBRyxFQUFFLG1CQUFtQjtDQUN6QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsT0FBTyxFQUNMLCtFQUErRTtJQUNqRixXQUFXLEVBQUUsd0JBQXdCO0lBQ3JDLEdBQUcsRUFBRSx1QkFBdUI7Q0FDN0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixPQUFPLEVBQ0wsK0VBQStFO0lBQ2pGLEdBQUcsRUFBRSxZQUFZO0NBQ2xCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUc7SUFDM0IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxHQUFHLEVBQUUsWUFBWTtDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDO0NBQ3ZDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0saUJBQWlCLEdBQUcsQ0FBQztDQUNuRSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ2pFLEdBQUcsRUFBRSx1QkFBdUI7Q0FDN0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLE9BQU8sRUFBRSxtQkFBbUI7SUFDNUIsR0FBRyxFQUFFLDBDQUEwQztDQUNoRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsT0FBTyxFQUFFLFlBQVk7SUFDckIsR0FBRyxFQUFFLHFDQUFxQztDQUMzQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUFFLHVDQUF1QztJQUNoRCxHQUFHLEVBQUUsb0NBQW9DO0NBQzFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRztJQUNwQyxPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDLEdBQUcsRUFBRSxtQ0FBbUM7Q0FDekMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHO0lBQ25ELE9BQU8sRUFBRSw2REFBNkQ7SUFDdEUsR0FBRyxFQUFFLHNDQUFzQztDQUM1QyxDQUFDO0FBRUYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHO0lBQ2pELE9BQU8sRUFBRSxvQ0FBb0M7SUFDN0MsR0FBRyxFQUFFLGdDQUFnQztDQUN0QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUc7SUFDOUMsT0FBTyxFQUFFLHFDQUFxQztJQUM5QyxHQUFHLEVBQUUsa0NBQWtDO0NBQ3hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRztJQUNyRCxPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLEdBQUcsRUFBRSxvREFBb0Q7Q0FDMUQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLE9BQU8sRUFDTCw4UUFBOFE7SUFDaFIsR0FBRyxFQUFFLHVCQUF1QjtDQUM3QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7SUFDNUMsT0FBTyxFQUNMLGkwQ0FBaTBDO0lBQ24wQyxHQUFHLEVBQUUsdUJBQXVCO0NBQzdCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixPQUFPLEVBQUUsNkJBQTZCO0lBQ3RDLEdBQUcsRUFBRSxlQUFlO0NBQ3JCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixPQUFPLEVBQUUsOENBQThDO0lBQ3ZELEdBQUcsRUFBRSxzQkFBc0I7SUFDM0IsV0FBVyxFQUFFLDZCQUE2QjtDQUMzQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEdBQUcsRUFBRSw0QkFBNEI7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM1QixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLEdBQUcsRUFBRSxnQkFBZ0I7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBET01BSU5fUEFUVEVSTl9CQVNFID0gJ14oW1xcXFxkYS16Li1dKylcXFxcLihbYS16Ll17Miw2fSkkJztcblxuZXhwb3J0IGNvbnN0IElQX1BBVFRFUk5fQkFTRSA9XG4gICdeKD86KD86MjVbMC01XXwyWzAtNF1cXFxcZHxbMDFdP1xcXFxkezEsMn0pXFxcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXFxcZHxbMDFdP1xcXFxkezEsMn0pJCc7XG5cbmV4cG9ydCBjb25zdCBJUFY2X1BBVFRFUk5fQkFTRSA9XG4gICdeKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl0rfDo6KGZmZmYoOjB7MSw0fSk/Oik/KCgyNVswLTVdfCgyWzAtNF18MT9bMC05XSk/WzAtOV0pLil7M30oMjVbMC01XXwoMlswLTRdfDE/WzAtOV0pP1swLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MT9bMC05XSk/WzAtOV0pLil7M30oMjVbMC01XXwoMlswLTRdfDE/WzAtOV0pP1swLTldKSkkJztcblxuY29uc3QgUFJPVE9DT0xfUEFUVEVSTl9CQVNFID0gJ2h0dHBzPzovLyc7XG5jb25zdCBQT1JUX1BBVFRFUk5fQkFTRSA9XG4gICcoOig2NTUzWzAtNV18NjU1WzAtMl1cXFxcZHw2NVswLTRdXFxcXGRcXFxcZHw2WzAtNF1cXFxcZFxcXFxkXFxcXGR8WzEtNV1cXFxcZFxcXFxkXFxcXGRcXFxcZHxbMS05XVxcXFxkXFxcXGRcXFxcZHxbMS05XVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxbMS05XSkpJztcblxuY29uc3QgYWRkUG9ydEFuZFByb3RvY29sID0gKHBhdHRlcm5TdHI6IHN0cmluZykgPT4ge1xuICBjb25zdCBtYWluID0gcGF0dGVyblN0ci5yZXBsYWNlKC8oXlxcXik/LywgJycpLnJlcGxhY2UoLyhcXCQ/KSQvLCAnJyk7XG4gIHJldHVybiBgXigke1BST1RPQ09MX1BBVFRFUk5fQkFTRX0pPyR7bWFpbn0oJHtQT1JUX1BBVFRFUk5fQkFTRX0pPyRgO1xufTtcblxuY29uc3QgYWRkUG9ydEFuZFByb3RvY29sRm9ySXB2NiA9IChwYXR0ZXJuU3RyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgbWFpbiA9IHBhdHRlcm5TdHIucmVwbGFjZSgvKF5cXF4pPy8sICcnKS5yZXBsYWNlKC8oXFwkPykkLywgJycpO1xuICByZXR1cm4gYCgke3BhdHRlcm5TdHJ9KXwoXigke1BST1RPQ09MX1BBVFRFUk5fQkFTRX0pXFxcXFske21haW59XFxcXF0kKXwoXigke1BST1RPQ09MX1BBVFRFUk5fQkFTRX0pP1xcXFxbJHttYWlufVxcXFxdKCR7UE9SVF9QQVRURVJOX0JBU0V9KSQpYDtcbn07XG5cbmV4cG9ydCBjb25zdCBQT1JUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgLyheWzEtOV1cXGR7MCwzfSQpfCheWzEtNV1cXGR7NH0kKXxeKDZbMC00XVxcZHszfSQpfCheNjVbMC00XVxcZHsyfSQpfCheNjU1WzAtMl1cXGQkKXwoXjY1NTNbMC01XSQpLyxcbiAgdGlwOiAnaW52YWxpZF9wb3J0Jyxcbn07XG5cbi8vIGluY2x1ZGUgaXB2NCwgZG9tYWluXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19IT1NUTkFNRV9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKGAoJHtJUF9QQVRURVJOX0JBU0V9KXwoJHtET01BSU5fUEFUVEVSTl9CQVNFfSlgKSxcbiAgdGlwOiAncmVnZXhwX3RpcF9pcF9hZGRyZXNzX29yX2hvc3RuYW1lJyxcbn07XG5cbi8vIGluY2x1ZGUgaXB2NiwgZG9tYWluXG5leHBvcnQgY29uc3QgSVBWNl9BRERSRVNTX0hPU1ROQU1FX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoYCgke0lQVjZfUEFUVEVSTl9CQVNFfSl8KCR7RE9NQUlOX1BBVFRFUk5fQkFTRX0pYCksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXB2Nl9hZGRyZXNzX29yX2hvc3RuYW1lJyxcbn07XG5cbi8vIGluY2x1ZGUgaXB2NCwgZG9tYWluLCBhbmQgc3VwcG9ydCBwb3J0IGFuZCBwcm90b2NvbFxuZXhwb3J0IGNvbnN0IElQX0FERFJFU1NfSE9TVE5BTUVfUE9SVF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKFxuICAgIGAoJHthZGRQb3J0QW5kUHJvdG9jb2woSVBfUEFUVEVSTl9CQVNFKX0pfCgke2FkZFBvcnRBbmRQcm90b2NvbChcbiAgICAgIERPTUFJTl9QQVRURVJOX0JBU0UsXG4gICAgKX0pYCxcbiAgKSxcbiAgdGlwOiAncmVnZXhwX3RpcF9pcF9hZGRyZXNzX29yX2hvc3RuYW1lJyxcbn07XG5cbi8vIGluY2x1ZGUgaXB2NiwgZG9tYWluLCBhbmQgc3VwcG9ydCBwb3J0IGFuZCBwcm90b2NvbFxuZXhwb3J0IGNvbnN0IElQVjZfQUREUkVTU19IT1NUTkFNRV9QT1JUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoXG4gICAgYCgke2FkZFBvcnRBbmRQcm90b2NvbEZvcklwdjYoSVBWNl9QQVRURVJOX0JBU0UpfSl8KCR7YWRkUG9ydEFuZFByb3RvY29sKFxuICAgICAgRE9NQUlOX1BBVFRFUk5fQkFTRSxcbiAgICApfSlgLFxuICApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwdjZfYWRkcmVzc19vcl9ob3N0bmFtZScsXG59O1xuXG4vLyBpbmNsdWRlICBpcHY0LCBpcHY2LCBkb21haW4sIGFuZCBzdXBwb3J0IHBvcnQgYW5kIHByb3RvY29sXG5leHBvcnQgY29uc3QgSVBWNF9JUFY2X0FERFJFU1NfSE9TVE5BTUVfUE9SVF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKFxuICAgIGAoJHthZGRQb3J0QW5kUHJvdG9jb2woSVBfUEFUVEVSTl9CQVNFKX0pfCgke2FkZFBvcnRBbmRQcm90b2NvbEZvcklwdjYoXG4gICAgICBJUFY2X1BBVFRFUk5fQkFTRSxcbiAgICApfSl8KCR7YWRkUG9ydEFuZFByb3RvY29sKERPTUFJTl9QQVRURVJOX0JBU0UpfSlgLFxuICApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwdjRfaXB2Nl9hZGRyZXNzX29yX2hvc3RuYW1lJyxcbn07XG5cbi8vIGluY2x1ZGUgaXB2NCwgaXB2NiwgZG9tYWluXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19IT1NUTkFNRV9QQVRURVJOX0VYVEVORCA9IHtcbiAgcGF0dGVybjogbmV3IFJlZ0V4cChcbiAgICBgKCR7SVBfUEFUVEVSTl9CQVNFfSl8KCR7RE9NQUlOX1BBVFRFUk5fQkFTRX0pfCgke0lQVjZfUEFUVEVSTl9CQVNFfSlgLFxuICApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3Nfb3JfaG9zdG5hbWUnLFxufTtcblxuZXhwb3J0IGNvbnN0IElQX0FERFJFU1NfU1VCTkVUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKFxcZHxbMS05XVxcZHwxXFxkezJ9fDJbMC00XVxcZHwyNVswLTVdKVxcLil7M30oXFxkfFsxLTldXFxkfDFcXGR7Mn18MlswLTRdXFxkfDI1WzAtNV0pXFwvXFxkKyQvLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3Nfd2l0aF9zdWJuZXQnLFxufTtcblxuZXhwb3J0IGNvbnN0IERPTUFJTl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKERPTUFJTl9QQVRURVJOX0JBU0UpLFxuICBwbGFjZWhvbGRlcjogJ2RvbWFpbl9yZWdleHBfcGxhY2Vob2xkZXInLFxuICB0aXA6ICdkb21haW5fcmVnZXhwX3RpcCcsXG59O1xuXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGR7MSwyfSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGR7MSwyfSkkLyxcbiAgcGxhY2Vob2xkZXI6ICdpcF9hZGRyZXNzX3BsYWNlaG9sZGVyJyxcbiAgdGlwOiAncmVnZXhwX3RpcF9pcF9hZGRyZXNzJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKCgyKDVbMC01XXxbMC00XVxcZCkpfFswMV0/XFxkezEsMn0pKFxcLigoMig1WzAtNV18WzAtNF1cXGQpKXxbMDFdP1xcZHsxLDJ9KSl7M30kLyxcbiAgdGlwOiAnaW52YWxpZF9pcCcsXG59O1xuXG5leHBvcnQgY29uc3QgSVBfVjZfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogbmV3IFJlZ0V4cChgJHtJUFY2X1BBVFRFUk5fQkFTRX1gKSxcbiAgdGlwOiAnaW52YWxpZF9pcCcsXG59O1xuXG5leHBvcnQgY29uc3QgSVBfVjZfQUREUkVTU19QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKElQVjZfUEFUVEVSTl9CQVNFKSxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9WNF9PUl9WNl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKGAoJHtJUF9QQVRURVJOX0JBU0V9KXwoJHtJUFY2X1BBVFRFUk5fQkFTRX0pYCksXG59O1xuXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19QT1JUX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoYCR7SVBfUEFUVEVSTl9CQVNFLnNsaWNlKDAsIC0xKX0oPzo6XFxcXGQrKT8kYCksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXBfYWRkcmVzcycsXG59O1xuXG5leHBvcnQgY29uc3QgSU5UX1pFUk9fUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14oMHxcXCs/WzEtOV1cXGQqKSQvLFxuICB0aXA6ICdyZWdleHBfdGlwX3Bvc2l0aXZlX2ludGVnZXJfcGF0dGVybl96ZXJvJyxcbn07XG5cbmV4cG9ydCBjb25zdCBQT1NJVElWRV9JTlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL15bMS05XVxcZCokLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9wb3NpdGl2ZV9pbnRlZ2VyX3BhdHRlcm4nLFxufTtcblxuZXhwb3J0IGNvbnN0IFBPU0lUSVZFX05VTUJFUl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXihbMS05XVxcZCooPzpcXC5cXGQqKT98MCpcXC4wKlsxLTldXFxkKikkLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9wb3NpdGl2ZV9udW1iZXJfcGF0dGVybicsXG59O1xuXG5leHBvcnQgY29uc3QgSzhTX1JFU09VUkNFX05BTUVfQkFTRSA9IHtcbiAgcGF0dGVybjogL15bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPyQvLFxuICB0aXA6ICdyZWdleHBfdGlwX2s4c19yZXNvdXJjZV9uYW1lX2Jhc2UnLFxufTtcblxuZXhwb3J0IGNvbnN0IEs4U19SRVNPVVJDRV9MQUJFTF9LRVlfUFJFRklYX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eW1xcZGEtel0oW1xcZGEtei1dKltcXGRhLXpdKT8oXFwuW1xcZGEtel0oW1xcZGEtei1dKltcXGRhLXpdKT8pKiQvLFxuICB0aXA6ICdyZWdleHBfdGlwX3Jlc291cmNlX2xhYmVsX2tleV9wcmVmaXgnLFxufTtcblxuLy8g5LiN6IO955u05o6l55So5p2l5qCh6aqMIGxhYmVsIGtlee+8jOmcgOimgeS9v+eUqCBgazhzUmVzb3VyY2VMYWJlbEtleVZhbGlkYXRvcmBcbmV4cG9ydCBjb25zdCBLOFNfUkVTT1VSQ0VfTEFCRUxfS0VZX05BTUVfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14oKFtcXGRBLVphLXpdW1xcdy4tXSopP1tcXGRBLVphLXpdKSQvLFxuICB0aXA6ICdrOHNfcmVzb3VyY2VfbGFiZWxfa2V5X2ludmFsaWQnLFxufTtcblxuZXhwb3J0IGNvbnN0IEs4U19SRVNPVVJDRV9MQUJFTF9WQUxVRV9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXigoW1xcZEEtWmEtel1bXFx3Li1dKik/W1xcZEEtWmEtel0pPyQvLFxuICB0aXA6ICdrOHNfcmVzb3VyY2VfbGFiZWxfdmFsdWVfaW52YWxpZCcsXG59O1xuXG5leHBvcnQgY29uc3QgSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZID0ge1xuICBwYXR0ZXJuOiAvXlthLXpdKFtcXGRhLXotXSpbXFxkYS16XSk/JC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX3Jlc291cmNlX25hbWVfc3RhcnRfd2l0aF9jaGFyc19vbmx5Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBIVFRQX0lQX09SX0RPTUFJTl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKChodHRwfGh0dHBzKTpcXC9cXC8pKCgoKDIoNVswLTVdfFswLTRdXFxkKSl8WzAxXT9cXGR7MSwyfSkoXFwuKCgyKDVbMC01XXxbMC00XVxcZCkpfFswMV0/XFxkezEsMn0pKXszfSl8KCgoW1xcZEEtWmEtei1dKltcXGRBLVphLXpdKVxcLikqKFtBLVphLXpdfFtBLVphLXpdW1xcZEEtWmEtei1dKltcXGRBLVphLXpdKSkpKDooKFsxLTldXFxkezAsM30pfChbMS01XVxcZHs0fSl8KDZbMC00XVxcZHszfSl8KDY1WzAtNF1cXGR7Mn0pfCg2NTVbMC0yXVxcZCl8KDY1NTNbMC01XSkpKT8oXFwvXFxTKikqJC8sXG4gIHRpcDogJ2RvbWFpbl9pcF9wbGFjZWhvbGRlcicsXG59O1xuXG5leHBvcnQgY29uc3QgSFRUUF9EVUFMX0lQX09SX0RPTUFJTl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKChodHRwfGh0dHBzKTpcXC9cXC8pKCgoKDIoNVswLTVdfFswLTRdXFxkKSl8WzAxXT9cXGR7MSwyfSkoXFwuKCgyKDVbMC01XXxbMC00XVxcZCkpfFswMV0/XFxkezEsMn0pKXszfSl8KCgoW1xcZEEtWmEtei1dKltcXGRBLVphLXpdKVxcLikqKFtBLVphLXpdfFtBLVphLXpdW1xcZEEtWmEtei1dKltcXGRBLVphLXpdKSl8KFxcWygoKFswLTlBLUZhLWZdezEsNH06KXs3fShbMC05QS1GYS1mXXsxLDR9fDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs2fSg6WzAtOUEtRmEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezV9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezR9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsM30pfCgoOlswLTlBLUZhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXszfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezJ9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNX0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9OikoKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoOigoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpKSglLispP1xcXSkpKDooKFsxLTldXFxkezAsM30pfChbMS01XVxcZHs0fSl8KDZbMC00XVxcZHszfSl8KDY1WzAtNF1cXGR7Mn0pfCg2NTVbMC0yXVxcZCl8KDY1NTNbMC01XSkpKT8oXFwvXFxTKikqJC8sXG4gIHRpcDogJ2RvbWFpbl9pcF9wbGFjZWhvbGRlcicsXG59O1xuXG5leHBvcnQgY29uc3QgSFRUUF9BRERSRVNTX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eKGh0dHB8aHR0cHMpOlxcL1xcLyhbXFx3Ll0pXFxTKiQvLFxuICB0aXA6ICdodHRwX2FkZHJlc3NfZm9ybWF0X2xpbWl0Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBFTUFJTF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXltcXHcuLV0rQFtcXHctXSsoXFwuW1xcdy1dKykrJC8sXG4gIHRpcDogJ2ludmFsaWRfZW1haWwnLFxufTtcblxuZXhwb3J0IGNvbnN0IElNQUdFX1RBR19QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXigoc2hhMjU2OltcXGRhLWZdezYsNjR9KXwoXFx3W1xcdy4tXXswLDEyN30pKSQvLFxuICB0aXA6ICdyZWdleHBfdGlwX2ltYWdlX3RhZycsXG4gIHBsYWNlaG9sZGVyOiAnaW1hZ2VfdGFnX2lucHV0X3BsYWNlaG9sZGVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJTlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14tP1xcZCskLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9pbnRlZ2VyX3BhdHRlcm4nLFxufTtcblxuZXhwb3J0IGNvbnN0IE5VTUJFUl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXi0/XFxkKyhcXC5cXGQqKT8kLyxcbiAgdGlwOiAnaW52YWxpZF9udW1iZXInLFxufTtcbiJdfQ==