// challenge 302 Easy Spelling With Chemistry
// https://w...content-available-to-author-only...t.com/r/dailyprogrammer/comments/5seexn/20170206_challenge_302_easy_spelling_with/
/*
Challenge Input:
functions
bacon
poison
sickness
ticklish
Challenge Output:
FUNCTiONS (flourine, uranium, nitrogen, carbon, titanium, oxygen, nitrogen, sulfur)
BaCoN (barium, cobalt, nitrogen)
POISON (phosphorus, oxygen, iodine, sulfur, oxygen, nitrogen)
SiCKNeSS (silicon, carbon, potassium, neon, sulfur, sulfur)
TiCKLiSH (titanium, carbon, potassium, lithium, sulfur, hydrogen)
*/
package challenge._302_easy
import java.util.*
import java.lang.*
data class Element(val atNum: Int, val symbol: String, val name: String, val atWt: Double)
val elements: MutableList<Element> = ArrayList<Element>()
val symMap: MutableMap<String, Element> = HashMap<String, Element>()
fun findSolutions(word: String) : List<List<Element>>? {
if (word.length == 0) return null
if (word.length == 1) {
val elem = symMap[word]
return if (elem != null) listOf(listOf(elem)) else null
}
if (word.length > 1) {
val rlst: MutableList<List<Element>> = ArrayList<List<Element>>()
val elem1 = symMap[word.substring(0..0)]
if (elem1!=null) {
val sol2 = findSolutions(word.substring(1))
if (sol2!=null) {
for (lst in sol2) {
val lst2: List<Element> = listOf(elem1) + lst
rlst.add(lst2)
}
}
}
val elem2 = symMap[word.substring(0..1)]
if (elem2 != null) {
if (word.length == 2) {
val lst2: List<Element> = listOf(elem2)
rlst.add(listOf(elem2))
} else {
val sol2 = findSolutions(word.substring(2))
if (sol2 != null) {
for (lst in sol2) {
val lst2: List<Element> = listOf(elem2) + lst
rlst.add(lst2)
}
}
}
}
return if (!rlst.isEmpty()) rlst else null
}
return null
}
fun formatSolution(solution: List<Element>): String {
val sb = StringBuilder()
val name = StringBuilder()
for (element in solution) {
name.append(element.symbol)
}
sb.append(name)
sb.append(" (")
val names: MutableList<String> = ArrayList<String>()
for (element in solution) {
names.add(element.name)
}
sb.append(names.joinToString(separator=" "))
sb.append(")")
return sb.toString()
}
fun findMaxWeightInfo(solutions: List<List<Element>>): Pair<Int, Double> {
var maxWeight: Double = 0.0
var maxWeightIndex: Int = -1
for ((index,solution) in solutions.withIndex()) {
var solutionWeight: Double = 0.0
for (element in solution) {
solutionWeight += element.atWt
}
if (solutionWeight > maxWeight) {
maxWeight = solutionWeight
maxWeightIndex = index
}
}
return Pair(maxWeightIndex, maxWeight)
}
fun main(args: Array<String>) {
for (elem in _elementData) {
val spl = elem.split(",")
val elem = Element(spl[0].toInt(), spl[1], spl[2].toLowerCase(), spl[3].toDouble())
elements.add(elem)
symMap[spl[1].toLowerCase()] = elem
}
val words = arrayOf("functions", "bacon", "poison", "sickness", "ticklish")
for (word in words) {
val solutions = findSolutions(word)
if (solutions != null) {
val count:Int = solutions.size
val weightInfo = findMaxWeightInfo(solutions)
for ((index,solution) in solutions.withIndex()) {
var text = formatSolution(solution)
if (solutions.size > 1 && weightInfo.first == index) {
text += " *"
}
println(text)
}
}
}
println("* - indicates max atomic weight in group")
}
val _elementData = arrayOf(
//"Atomic Number,SI Symbol,Element,Atomic Weight",
"1,H,Hydrogen,1.00794",
"2,He,Helium,4.002602",
"3,Li,Lithium,6.941",
"4,Be,Beryllium,9.012182",
"5,B,Boron,10.811",
"6,C,Carbon,12.0107",
"7,N,Nitrogen,14.0067",
"8,O,Oxygen,15.9994",
"9,F,Fluorine,18.9984032",
"10,Ne,Neon,20.1797",
"11,Na,Sodium,22.98976928",
"12,Mg,Magnesium,24.3050",
"13,Al,Aluminium,26.9815386",
"14,Si,Silicon,28.0855",
"15,P,Phosphorus,30.973762",
"16,S,Sulfur,32.065",
"17,Cl,Chlorine,35.453",
"18,Ar,Argon,39.948",
"19,K,Potassium,39.0983",
"20,Ca,Calcium,40.078",
"21,Sc,Scandium,44.955912",
"22,Ti,Titanium,47.867",
"23,V,Vanadium,50.9415",
"24,Cr,Chromium,51.9961",
"25,Mn,Manganese,54.938045",
"26,Fe,Iron,55.845",
"27,Co,Cobalt,58.933195",
"28,Ni,Nickel,58.6934",
"29,Cu,Copper,63.546",
"30,Zn,Zinc,65.38",
"31,Ga,Gallium,69.723",
"32,Ge,Germanium,72.64",
"33,As,Arsenic,74.92160",
"34,Se,Selenium,78.96",
"35,Br,Bromine,79.904",
"36,Kr,Krypton,83.798",
"37,Rb,Rubidium,85.4678",
"38,Sr,Strontium,87.62",
"39,Y,Yttrium,88.90585",
"40,Zr,Zirconium,91.224",
"41,Nb,Niobium,92.90638",
"42,Mo,Molybdenum,95.96",
"43,Tc,Technetium,98",
"44,Ru,Ruthenium,101.07",
"45,Rh,Rhodium,102.90550",
"46,Pd,Palladium,106.42",
"47,Ag,Silver,107.8682",
"48,Cd,Cadmium,112.411",
"49,In,Indium,114.818",
"50,Sn,Tin,118.710",
"51,Sb,Antimony,121.760",
"52,Te,Tellurium,127.60",
"53,I,Iodine,126.90447",
"54,Xe,Xenon,131.293",
"55,Cs,Cesium,132.9054519",
"56,Ba,Barium,137.327",
"57,La,Lanthanum,138.90547",
"58,Ce,Cerium,140.116",
"59,Pr,Praseodymium,140.90765",
"60,Nd,Neodymium,144.242",
"61,Pm,Promethium,145",
"62,Sm,Samarium,150.36",
"63,Eu,Europium,151.964",
"64,Gd,Gadolinium,157.25",
"65,Tb,Terbium,158.92535",
"66,Dy,Dysprosium,162.500",
"67,Ho,Holmium,164.93032",
"68,Er,Erbium,167.259",
"69,Tm,Thulium,168.93421",
"70,Yb,Ytterbium,173.054",
"71,Lu,Lutetium,174.9668",
"72,Hf,Hafnium,178.49",
"73,Ta,Tantalum,180.94788",
"74,W,Tungsten,183.84",
"75,Re,Rhenium,186.207",
"76,Os,Osmium,190.23",
"77,Ir,Iridium,192.217",
"78,Pt,Platinum,195.084",
"79,Au,Gold,196.966569",
"80,Hg,Mercury,200.59",
"81,Tl,Thallium,204.3833",
"82,Pb,Lead,207.2",
"83,Bi,Bismuth,208.98040",
"84,Po,Polonium,209",
"85,At,Astatine,210",
"86,Rn,Radon,222",
"87,Fr,Francium,223",
"88,Ra,Radium,226",
"89,Ac,Actinium,227",
"90,Th,Thorium,232.03806",
"91,Pa,Protactinium,231.03588",
"92,U,Uranium,238.02891",
"93,Np,Neptunium,237",
"94,Pu,Plutonium,244",
"95,Am,Americium,243",
"96,Cm,Curium,247",
"97,Bk,Berkelium,247",
"98,Cf,Californium,251",
"99,Es,Einsteinium,252",
"100,Fm,Fermium,257",
"101,Md,Mendelevium,258",
"102,No,Nobelium,259",
"103,Lr,Lawrencium,266",
"104,Rf,Rutherfordium,267",
"105,Db,Dubnium,268",
"106,Sg,Seaborgium,269",
"107,Bh,Bohrium,270",
"108,Hs,Hassium,277",
"109,Mt,Meitnerium,278",
"110,Ds,Darmstadtium,281",
"111,Rg,Roentgenium,282",
"112,Cn,Copernicium,285",
"113,Nh,Nihonium,284",
"114,Fl,Flerovium,286",
"115,Mc,Moscovium,290",
"116,Lv,Livermorium,293",
"117,Ts,Tennessine,294",
"118,Og,Oganesson,294"
)
Ly8gY2hhbGxlbmdlIDMwMiBFYXN5IFNwZWxsaW5nIFdpdGggQ2hlbWlzdHJ5Ci8vIGh0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4udC5jb20vci9kYWlseXByb2dyYW1tZXIvY29tbWVudHMvNXNlZXhuLzIwMTcwMjA2X2NoYWxsZW5nZV8zMDJfZWFzeV9zcGVsbGluZ193aXRoLwoKLyoKQ2hhbGxlbmdlIElucHV0OgpmdW5jdGlvbnMKYmFjb24KcG9pc29uCnNpY2tuZXNzCnRpY2tsaXNoCgpDaGFsbGVuZ2UgT3V0cHV0OgpGVU5DVGlPTlMgKGZsb3VyaW5lLCB1cmFuaXVtLCBuaXRyb2dlbiwgY2FyYm9uLCB0aXRhbml1bSwgb3h5Z2VuLCBuaXRyb2dlbiwgc3VsZnVyKQpCYUNvTiAoYmFyaXVtLCBjb2JhbHQsIG5pdHJvZ2VuKQpQT0lTT04gKHBob3NwaG9ydXMsIG94eWdlbiwgaW9kaW5lLCBzdWxmdXIsIG94eWdlbiwgbml0cm9nZW4pClNpQ0tOZVNTIChzaWxpY29uLCBjYXJib24sIHBvdGFzc2l1bSwgbmVvbiwgc3VsZnVyLCBzdWxmdXIpClRpQ0tMaVNIICh0aXRhbml1bSwgY2FyYm9uLCBwb3Rhc3NpdW0sIGxpdGhpdW0sIHN1bGZ1ciwgaHlkcm9nZW4pCiAqLwpwYWNrYWdlIGNoYWxsZW5nZS5fMzAyX2Vhc3kKCmltcG9ydCBqYXZhLnV0aWwuKgppbXBvcnQgamF2YS5sYW5nLioKCmRhdGEgY2xhc3MgRWxlbWVudCh2YWwgYXROdW06IEludCwgdmFsIHN5bWJvbDogU3RyaW5nLCB2YWwgbmFtZTogU3RyaW5nLCB2YWwgYXRXdDogRG91YmxlKQp2YWwgZWxlbWVudHM6IE11dGFibGVMaXN0PEVsZW1lbnQ+ID0gQXJyYXlMaXN0PEVsZW1lbnQ+KCkKdmFsIHN5bU1hcDogTXV0YWJsZU1hcDxTdHJpbmcsIEVsZW1lbnQ+ID0gSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+KCkKZnVuIGZpbmRTb2x1dGlvbnMod29yZDogU3RyaW5nKSA6IExpc3Q8TGlzdDxFbGVtZW50Pj4/IHsKICAgIGlmICh3b3JkLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbAogICAgaWYgKHdvcmQubGVuZ3RoID09IDEpIHsKICAgICAgICB2YWwgZWxlbSA9IHN5bU1hcFt3b3JkXQogICAgICAgIHJldHVybiBpZiAoZWxlbSAhPSBudWxsKSBsaXN0T2YobGlzdE9mKGVsZW0pKSBlbHNlIG51bGwKICAgIH0KICAgIGlmICh3b3JkLmxlbmd0aCA+IDEpIHsKICAgICAgICB2YWwgcmxzdDogTXV0YWJsZUxpc3Q8TGlzdDxFbGVtZW50Pj4gPSBBcnJheUxpc3Q8TGlzdDxFbGVtZW50Pj4oKQogICAgICAgIHZhbCBlbGVtMSA9IHN5bU1hcFt3b3JkLnN1YnN0cmluZygwLi4wKV0KICAgICAgICBpZiAoZWxlbTEhPW51bGwpIHsKICAgICAgICAgICAgdmFsIHNvbDIgPSBmaW5kU29sdXRpb25zKHdvcmQuc3Vic3RyaW5nKDEpKQogICAgICAgICAgICBpZiAoc29sMiE9bnVsbCkgewogICAgICAgICAgICAgICAgZm9yIChsc3QgaW4gc29sMikgewogICAgICAgICAgICAgICAgICAgIHZhbCBsc3QyOiBMaXN0PEVsZW1lbnQ+ID0gbGlzdE9mKGVsZW0xKSArIGxzdAogICAgICAgICAgICAgICAgICAgIHJsc3QuYWRkKGxzdDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhbCBlbGVtMiA9IHN5bU1hcFt3b3JkLnN1YnN0cmluZygwLi4xKV0KICAgICAgICBpZiAoZWxlbTIgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAod29yZC5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgdmFsIGxzdDI6IExpc3Q8RWxlbWVudD4gPSBsaXN0T2YoZWxlbTIpCiAgICAgICAgICAgICAgICBybHN0LmFkZChsaXN0T2YoZWxlbTIpKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsIHNvbDIgPSBmaW5kU29sdXRpb25zKHdvcmQuc3Vic3RyaW5nKDIpKQogICAgICAgICAgICAgICAgaWYgKHNvbDIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGZvciAobHN0IGluIHNvbDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGxzdDI6IExpc3Q8RWxlbWVudD4gPSBsaXN0T2YoZWxlbTIpICsgbHN0CiAgICAgICAgICAgICAgICAgICAgICAgIHJsc3QuYWRkKGxzdDIpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAoIXJsc3QuaXNFbXB0eSgpKSBybHN0IGVsc2UgbnVsbAogICAgfQogICAgcmV0dXJuIG51bGwKfQpmdW4gZm9ybWF0U29sdXRpb24oc29sdXRpb246IExpc3Q8RWxlbWVudD4pOiBTdHJpbmcgewogICAgdmFsIHNiID0gU3RyaW5nQnVpbGRlcigpCiAgICB2YWwgbmFtZSA9IFN0cmluZ0J1aWxkZXIoKQogICAgZm9yIChlbGVtZW50IGluIHNvbHV0aW9uKSB7CiAgICAgICAgbmFtZS5hcHBlbmQoZWxlbWVudC5zeW1ib2wpCiAgICB9CiAgICBzYi5hcHBlbmQobmFtZSkKICAgIHNiLmFwcGVuZCgiICgiKQogICAgdmFsIG5hbWVzOiBNdXRhYmxlTGlzdDxTdHJpbmc+ID0gQXJyYXlMaXN0PFN0cmluZz4oKQogICAgZm9yIChlbGVtZW50IGluIHNvbHV0aW9uKSB7CiAgICAgICAgbmFtZXMuYWRkKGVsZW1lbnQubmFtZSkKICAgIH0KICAgIHNiLmFwcGVuZChuYW1lcy5qb2luVG9TdHJpbmcoc2VwYXJhdG9yPSIgIikpCiAgICBzYi5hcHBlbmQoIikiKQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkKfQoKZnVuIGZpbmRNYXhXZWlnaHRJbmZvKHNvbHV0aW9uczogTGlzdDxMaXN0PEVsZW1lbnQ+Pik6IFBhaXI8SW50LCBEb3VibGU+IHsKICAgIHZhciBtYXhXZWlnaHQ6IERvdWJsZSA9IDAuMAogICAgdmFyIG1heFdlaWdodEluZGV4OiBJbnQgPSAtMQogICAgZm9yICgoaW5kZXgsc29sdXRpb24pIGluIHNvbHV0aW9ucy53aXRoSW5kZXgoKSkgewogICAgICAgIHZhciBzb2x1dGlvbldlaWdodDogRG91YmxlID0gMC4wCiAgICAgICAgZm9yIChlbGVtZW50IGluIHNvbHV0aW9uKSB7CiAgICAgICAgICAgIHNvbHV0aW9uV2VpZ2h0ICs9IGVsZW1lbnQuYXRXdAogICAgICAgIH0KICAgICAgICBpZiAoc29sdXRpb25XZWlnaHQgPiBtYXhXZWlnaHQpIHsKICAgICAgICAgICAgbWF4V2VpZ2h0ID0gc29sdXRpb25XZWlnaHQKICAgICAgICAgICAgbWF4V2VpZ2h0SW5kZXggPSBpbmRleAogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBQYWlyKG1heFdlaWdodEluZGV4LCBtYXhXZWlnaHQpCn0KZnVuIG1haW4oYXJnczogQXJyYXk8U3RyaW5nPikgewogICAgZm9yIChlbGVtIGluIF9lbGVtZW50RGF0YSkgewogICAgICAgIHZhbCBzcGwgPSBlbGVtLnNwbGl0KCIsIikKICAgICAgICB2YWwgZWxlbSA9IEVsZW1lbnQoc3BsWzBdLnRvSW50KCksIHNwbFsxXSwgc3BsWzJdLnRvTG93ZXJDYXNlKCksIHNwbFszXS50b0RvdWJsZSgpKQogICAgICAgIGVsZW1lbnRzLmFkZChlbGVtKQogICAgICAgIHN5bU1hcFtzcGxbMV0udG9Mb3dlckNhc2UoKV0gPSBlbGVtCiAgICB9CgogICAgdmFsIHdvcmRzID0gYXJyYXlPZigiZnVuY3Rpb25zIiwgImJhY29uIiwgInBvaXNvbiIsICJzaWNrbmVzcyIsICJ0aWNrbGlzaCIpCiAgICBmb3IgKHdvcmQgaW4gd29yZHMpIHsKICAgICAgICB2YWwgc29sdXRpb25zID0gZmluZFNvbHV0aW9ucyh3b3JkKQogICAgICAgIGlmIChzb2x1dGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICB2YWwgY291bnQ6SW50ID0gc29sdXRpb25zLnNpemUKICAgICAgICAgICAgdmFsIHdlaWdodEluZm8gPSBmaW5kTWF4V2VpZ2h0SW5mbyhzb2x1dGlvbnMpCiAgICAgICAgICAgIGZvciAoKGluZGV4LHNvbHV0aW9uKSBpbiBzb2x1dGlvbnMud2l0aEluZGV4KCkpIHsKICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gZm9ybWF0U29sdXRpb24oc29sdXRpb24pCiAgICAgICAgICAgICAgICBpZiAoc29sdXRpb25zLnNpemUgPiAxICYmIHdlaWdodEluZm8uZmlyc3QgPT0gaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiAqIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJpbnRsbih0ZXh0KQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcHJpbnRsbigiKiAtIGluZGljYXRlcyBtYXggYXRvbWljIHdlaWdodCBpbiBncm91cCIpCn0KCnZhbCBfZWxlbWVudERhdGEgPSBhcnJheU9mKAogICAgICAgIC8vIkF0b21pYyBOdW1iZXIsU0kgU3ltYm9sLEVsZW1lbnQsQXRvbWljIFdlaWdodCIsCiAgICAgICAgIjEsSCxIeWRyb2dlbiwxLjAwNzk0IiwKICAgICAgICAiMixIZSxIZWxpdW0sNC4wMDI2MDIiLAogICAgICAgICIzLExpLExpdGhpdW0sNi45NDEiLAogICAgICAgICI0LEJlLEJlcnlsbGl1bSw5LjAxMjE4MiIsCiAgICAgICAgIjUsQixCb3JvbiwxMC44MTEiLAogICAgICAgICI2LEMsQ2FyYm9uLDEyLjAxMDciLAogICAgICAgICI3LE4sTml0cm9nZW4sMTQuMDA2NyIsCiAgICAgICAgIjgsTyxPeHlnZW4sMTUuOTk5NCIsCiAgICAgICAgIjksRixGbHVvcmluZSwxOC45OTg0MDMyIiwKICAgICAgICAiMTAsTmUsTmVvbiwyMC4xNzk3IiwKICAgICAgICAiMTEsTmEsU29kaXVtLDIyLjk4OTc2OTI4IiwKICAgICAgICAiMTIsTWcsTWFnbmVzaXVtLDI0LjMwNTAiLAogICAgICAgICIxMyxBbCxBbHVtaW5pdW0sMjYuOTgxNTM4NiIsCiAgICAgICAgIjE0LFNpLFNpbGljb24sMjguMDg1NSIsCiAgICAgICAgIjE1LFAsUGhvc3Bob3J1cywzMC45NzM3NjIiLAogICAgICAgICIxNixTLFN1bGZ1ciwzMi4wNjUiLAogICAgICAgICIxNyxDbCxDaGxvcmluZSwzNS40NTMiLAogICAgICAgICIxOCxBcixBcmdvbiwzOS45NDgiLAogICAgICAgICIxOSxLLFBvdGFzc2l1bSwzOS4wOTgzIiwKICAgICAgICAiMjAsQ2EsQ2FsY2l1bSw0MC4wNzgiLAogICAgICAgICIyMSxTYyxTY2FuZGl1bSw0NC45NTU5MTIiLAogICAgICAgICIyMixUaSxUaXRhbml1bSw0Ny44NjciLAogICAgICAgICIyMyxWLFZhbmFkaXVtLDUwLjk0MTUiLAogICAgICAgICIyNCxDcixDaHJvbWl1bSw1MS45OTYxIiwKICAgICAgICAiMjUsTW4sTWFuZ2FuZXNlLDU0LjkzODA0NSIsCiAgICAgICAgIjI2LEZlLElyb24sNTUuODQ1IiwKICAgICAgICAiMjcsQ28sQ29iYWx0LDU4LjkzMzE5NSIsCiAgICAgICAgIjI4LE5pLE5pY2tlbCw1OC42OTM0IiwKICAgICAgICAiMjksQ3UsQ29wcGVyLDYzLjU0NiIsCiAgICAgICAgIjMwLFpuLFppbmMsNjUuMzgiLAogICAgICAgICIzMSxHYSxHYWxsaXVtLDY5LjcyMyIsCiAgICAgICAgIjMyLEdlLEdlcm1hbml1bSw3Mi42NCIsCiAgICAgICAgIjMzLEFzLEFyc2VuaWMsNzQuOTIxNjAiLAogICAgICAgICIzNCxTZSxTZWxlbml1bSw3OC45NiIsCiAgICAgICAgIjM1LEJyLEJyb21pbmUsNzkuOTA0IiwKICAgICAgICAiMzYsS3IsS3J5cHRvbiw4My43OTgiLAogICAgICAgICIzNyxSYixSdWJpZGl1bSw4NS40Njc4IiwKICAgICAgICAiMzgsU3IsU3Ryb250aXVtLDg3LjYyIiwKICAgICAgICAiMzksWSxZdHRyaXVtLDg4LjkwNTg1IiwKICAgICAgICAiNDAsWnIsWmlyY29uaXVtLDkxLjIyNCIsCiAgICAgICAgIjQxLE5iLE5pb2JpdW0sOTIuOTA2MzgiLAogICAgICAgICI0MixNbyxNb2x5YmRlbnVtLDk1Ljk2IiwKICAgICAgICAiNDMsVGMsVGVjaG5ldGl1bSw5OCIsCiAgICAgICAgIjQ0LFJ1LFJ1dGhlbml1bSwxMDEuMDciLAogICAgICAgICI0NSxSaCxSaG9kaXVtLDEwMi45MDU1MCIsCiAgICAgICAgIjQ2LFBkLFBhbGxhZGl1bSwxMDYuNDIiLAogICAgICAgICI0NyxBZyxTaWx2ZXIsMTA3Ljg2ODIiLAogICAgICAgICI0OCxDZCxDYWRtaXVtLDExMi40MTEiLAogICAgICAgICI0OSxJbixJbmRpdW0sMTE0LjgxOCIsCiAgICAgICAgIjUwLFNuLFRpbiwxMTguNzEwIiwKICAgICAgICAiNTEsU2IsQW50aW1vbnksMTIxLjc2MCIsCiAgICAgICAgIjUyLFRlLFRlbGx1cml1bSwxMjcuNjAiLAogICAgICAgICI1MyxJLElvZGluZSwxMjYuOTA0NDciLAogICAgICAgICI1NCxYZSxYZW5vbiwxMzEuMjkzIiwKICAgICAgICAiNTUsQ3MsQ2VzaXVtLDEzMi45MDU0NTE5IiwKICAgICAgICAiNTYsQmEsQmFyaXVtLDEzNy4zMjciLAogICAgICAgICI1NyxMYSxMYW50aGFudW0sMTM4LjkwNTQ3IiwKICAgICAgICAiNTgsQ2UsQ2VyaXVtLDE0MC4xMTYiLAogICAgICAgICI1OSxQcixQcmFzZW9keW1pdW0sMTQwLjkwNzY1IiwKICAgICAgICAiNjAsTmQsTmVvZHltaXVtLDE0NC4yNDIiLAogICAgICAgICI2MSxQbSxQcm9tZXRoaXVtLDE0NSIsCiAgICAgICAgIjYyLFNtLFNhbWFyaXVtLDE1MC4zNiIsCiAgICAgICAgIjYzLEV1LEV1cm9waXVtLDE1MS45NjQiLAogICAgICAgICI2NCxHZCxHYWRvbGluaXVtLDE1Ny4yNSIsCiAgICAgICAgIjY1LFRiLFRlcmJpdW0sMTU4LjkyNTM1IiwKICAgICAgICAiNjYsRHksRHlzcHJvc2l1bSwxNjIuNTAwIiwKICAgICAgICAiNjcsSG8sSG9sbWl1bSwxNjQuOTMwMzIiLAogICAgICAgICI2OCxFcixFcmJpdW0sMTY3LjI1OSIsCiAgICAgICAgIjY5LFRtLFRodWxpdW0sMTY4LjkzNDIxIiwKICAgICAgICAiNzAsWWIsWXR0ZXJiaXVtLDE3My4wNTQiLAogICAgICAgICI3MSxMdSxMdXRldGl1bSwxNzQuOTY2OCIsCiAgICAgICAgIjcyLEhmLEhhZm5pdW0sMTc4LjQ5IiwKICAgICAgICAiNzMsVGEsVGFudGFsdW0sMTgwLjk0Nzg4IiwKICAgICAgICAiNzQsVyxUdW5nc3RlbiwxODMuODQiLAogICAgICAgICI3NSxSZSxSaGVuaXVtLDE4Ni4yMDciLAogICAgICAgICI3NixPcyxPc21pdW0sMTkwLjIzIiwKICAgICAgICAiNzcsSXIsSXJpZGl1bSwxOTIuMjE3IiwKICAgICAgICAiNzgsUHQsUGxhdGludW0sMTk1LjA4NCIsCiAgICAgICAgIjc5LEF1LEdvbGQsMTk2Ljk2NjU2OSIsCiAgICAgICAgIjgwLEhnLE1lcmN1cnksMjAwLjU5IiwKICAgICAgICAiODEsVGwsVGhhbGxpdW0sMjA0LjM4MzMiLAogICAgICAgICI4MixQYixMZWFkLDIwNy4yIiwKICAgICAgICAiODMsQmksQmlzbXV0aCwyMDguOTgwNDAiLAogICAgICAgICI4NCxQbyxQb2xvbml1bSwyMDkiLAogICAgICAgICI4NSxBdCxBc3RhdGluZSwyMTAiLAogICAgICAgICI4NixSbixSYWRvbiwyMjIiLAogICAgICAgICI4NyxGcixGcmFuY2l1bSwyMjMiLAogICAgICAgICI4OCxSYSxSYWRpdW0sMjI2IiwKICAgICAgICAiODksQWMsQWN0aW5pdW0sMjI3IiwKICAgICAgICAiOTAsVGgsVGhvcml1bSwyMzIuMDM4MDYiLAogICAgICAgICI5MSxQYSxQcm90YWN0aW5pdW0sMjMxLjAzNTg4IiwKICAgICAgICAiOTIsVSxVcmFuaXVtLDIzOC4wMjg5MSIsCiAgICAgICAgIjkzLE5wLE5lcHR1bml1bSwyMzciLAogICAgICAgICI5NCxQdSxQbHV0b25pdW0sMjQ0IiwKICAgICAgICAiOTUsQW0sQW1lcmljaXVtLDI0MyIsCiAgICAgICAgIjk2LENtLEN1cml1bSwyNDciLAogICAgICAgICI5NyxCayxCZXJrZWxpdW0sMjQ3IiwKICAgICAgICAiOTgsQ2YsQ2FsaWZvcm5pdW0sMjUxIiwKICAgICAgICAiOTksRXMsRWluc3RlaW5pdW0sMjUyIiwKICAgICAgICAiMTAwLEZtLEZlcm1pdW0sMjU3IiwKICAgICAgICAiMTAxLE1kLE1lbmRlbGV2aXVtLDI1OCIsCiAgICAgICAgIjEwMixObyxOb2JlbGl1bSwyNTkiLAogICAgICAgICIxMDMsTHIsTGF3cmVuY2l1bSwyNjYiLAogICAgICAgICIxMDQsUmYsUnV0aGVyZm9yZGl1bSwyNjciLAogICAgICAgICIxMDUsRGIsRHVibml1bSwyNjgiLAogICAgICAgICIxMDYsU2csU2VhYm9yZ2l1bSwyNjkiLAogICAgICAgICIxMDcsQmgsQm9ocml1bSwyNzAiLAogICAgICAgICIxMDgsSHMsSGFzc2l1bSwyNzciLAogICAgICAgICIxMDksTXQsTWVpdG5lcml1bSwyNzgiLAogICAgICAgICIxMTAsRHMsRGFybXN0YWR0aXVtLDI4MSIsCiAgICAgICAgIjExMSxSZyxSb2VudGdlbml1bSwyODIiLAogICAgICAgICIxMTIsQ24sQ29wZXJuaWNpdW0sMjg1IiwKICAgICAgICAiMTEzLE5oLE5paG9uaXVtLDI4NCIsCiAgICAgICAgIjExNCxGbCxGbGVyb3ZpdW0sMjg2IiwKICAgICAgICAiMTE1LE1jLE1vc2Nvdml1bSwyOTAiLAogICAgICAgICIxMTYsTHYsTGl2ZXJtb3JpdW0sMjkzIiwKICAgICAgICAiMTE3LFRzLFRlbm5lc3NpbmUsMjk0IiwKICAgICAgICAiMTE4LE9nLE9nYW5lc3NvbiwyOTQiCiAgICAgICAgKQ==