Dot Net Perls
Top 37 C# Example Pages...

[";sywttsrkrytthtdrtkrrt.t.bZ(CEST~~}T~~YF6666666666+BCCXB#CPXCCP4AXCEP69#CCC(CCXCCCP75666656(CsBBCP95468FXBBBC*BaBCCXS}T~~}T~~","IEqualityComparer."," This interface introduces a custom GetHashCode method. We implement this interface in the C# language. We also measure performance.","String keys."," We compare GetHashCode methods on custom string keys. We use it with the Dictionary type. You can implement the IEqualityComparer interface for the Dictionary collection.","First example."," First we see the custom IEqualityComparer I defined. It implements the IEqualityComparer interface, and its name is StringIndexKeyComparer. ","Note: ","Your comparer can have any name, but it must use the interface inheritance syntax as shown.","Interface ","interface","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","Based on:"," .NET 4.6\n\n","Class that implements IEqualityComparer: C#","\n\npublic class StringIndexKeyComparer : IEqualityComparer<string>\n{","\n /// <summary>\n /// Has a good distribution.\n /// </summary>\n ","const int _multiplier = 89;","\n\n /// <summary>\n /// Whether the two strings are equal\n /// </summary>\n ","public bool Equals(string x, string y)\n {\n return x == y;\n }","\n\n /// <summary>\n /// Return the hash code for this string.\n /// </summary>\n ","public int GetHashCode(string obj)\n {","\n // Stores the result.\n ","int result = 0;","\n\n // Don't compute hash code on null object.\n ","if (obj == null)\n {\n return 0;\n }","\n\n // Get length.\n ","int length = obj.Length;","\n\n // Return default code for zero-length strings [valid, nothing to hash with].\n ","if (length > 0)\n {","\n // Compute hash for strings with length greater than 1\n ","char let1 = obj[0];"," // First char of string we use\n ","char let2 = obj[length - 1];"," // Final char\n\n // Compute hash code from two characters\n ","int part1 = let1 + length;\n result = (_multiplier * part1) + let2 + length;\n }\n return result;\n }\n}","Class, notes."," This class implements IEqualityComparer. To implement that interface, it must define Equals and GetHashCode. The class uses a new GetHashCode implementation. ","IEqualityComparer Interface: MSDN ","https://msdn.microsoft.com/en-us/library/ms132151.aspx","Tip: ","The GetHashCode method above is optimal on the string keys I had. You will need to write your own GetHashCode method.","Tip 2: ","You should compute the result from the most significant parts of your keys, which provide the best distribution of the return value.","GetHashCode."," This method computes its result from the key[1] char, and from the final character in key. It applies a multiplier to the first character, and also adds the length of the key. ","Multiply ","multiply","Keys."," A Dictionary can have any type keys and values. But the hashing method used for those types is the default, unless you pass in an IEqualityComparer in the Dictionary constructor. ","Note: ","For my project, I have a set of about 650 string keys. The string keys are in a certain format, with a pattern to their characters.","String keys:","\n\n22D-Array-IEnumerable\n22D-Array-Use\n27-Zip\n27-Zip-DEFLATE-Ratio\n27-Zip-Examples\n2About\n2Action-Dictionary\n2Adobe-CS3-Rounded\n2Adobe-Fireworks-CS3-Resampling","Keys, analysis."," The string keys have the same first character, which is a digit. Because this first character is monotonous, it isn't useful for hashing because its distribution is poor. ","And: ","I decided that the best distribution of hash codes would use the second character, the length, and another character.","So: ","To reduce collisions, one character would need to be multiplied by a constant.","Benchmark: tested on 499 string keys","\n\nDefault string IEqualityComparer: ","4043 ms","\nCustom IEqualityComparer: ","2736 ms","Example, use IEqualityComparer."," We pass an instance of the IEqualityComparer to the Dictionary constructor. It is a good idea to use a static instance of your IEqualityComparer. ","Next: ","The code uses the same custom IEqualityComparer shown earlier in this document. It is passed to the Dictionary in the constructor.","Constructor ","constructor","C# program that uses custom class","\n\nusing System;\nusing System.Collections.Generic;","\n\n/// <summary>\n/// [see above]\n/// </summary>\n","public class StringIndexKeyComparer : IEqualityComparer<string>\n{","\n // [see above]\n","}\n\nclass Program\n{\n static void Main()\n {\n var custom = new Dictionary<string, bool>(","new StringIndexKeyComparer()",");\n custom.Add(\"22D-Array-IEnumerable\", true);\n custom.Add(\"22D-Array-Use\", true);\n custom.Add(\"27-Zip\", true);\n custom.Add(\"27-Zip-DEFLATE-Ratio\", true);\n custom.Add(\"27-Zip-Examples\", true);\n custom.Add(\"2About\", true);\n custom.Add(\"2Action-Dictionary\", true);\n custom.Add(\"2Adobe-CS3-Rounded\", true);\n custom.Add(\"2Adobe-Fireworks-CS3-Resampling\", true);\n }\n}","A discussion."," An excellent hash code can improve your Dictionary's performance. There are excellent books on this topic, such as Robert Sedgewick's Algorithms in C++, which I used. ","Tip: ","To better distribute the hash code computations in your program, using a multiplier is useful.","Tip 2: ","A hashtable has an internal array of buckets, and when you use a multiplier, you can spread out the indexes to those buckets.","And: ","This reduces the number of hash collisions and improves lookup performance.","Multiplier."," The constant 89 provides a good hashing distribution in many string data sets. There is a custom constructor I defined on the StringIndexKeyComparer. ","Tip: ","Any GetHashCode method will have to be custom to your keys. Therefore, just delete the contents of GetHashCode and start over.","But: ","It is not worth implementing on most projects, unless there is a bottleneck on your Dictionary, which rarely occurs.","Fuzzy lookups."," A Dictionary by default uses exact lookups. It computes a hash code based on a key and if another value matches it exactly, the two keys match. But this can be changed. ","Next: ","We implement a custom, fuzzy lookup that ignores characters. This is the custom IEqualityComparer.","Tip: ","It computes hashes (in GetHashCode) and compares keys (in Equals) ignoring all hyphen characters.","So: ","The string \"cat-1\" is considered equal to the string \"cat1.\" The hyphen (dash) character is simply ignored.","Example custom IEqualityComparer: C#","\n\nusing System.Collections.Generic;\n\nclass CustomComparer : ","IEqualityComparer","<string>\n{\n public bool ","Equals","(string x, string y)\n {\n int xPos = 0;\n int yPos = 0;\n while (true)\n {","\n // ... Fail if past end.\n ","if (xPos >= x.Length)\n {\n return false;\n }\n if (yPos >= y.Length)\n {\n return false;\n }","\n // ... Skip past hyphens.\n ","if (x[xPos] == '-')\n {\n xPos++;\n continue;\n }\n if (y[yPos] == '-')\n {\n yPos++;\n continue;\n }","\n // ... Fail if different.\n ","if (x[xPos] != y[yPos])\n {\n return false;\n }","\n // ... If we have traversed both strings with no error, we match.\n ","if (xPos == x.Length - 1 &&\n yPos == y.Length - 1)\n {\n return true;\n }\n // ... Increment both places.\n xPos++;\n yPos++;\n }\n }\n\n public int ","GetHashCode","(string obj)\n {\n int code = 0;","\n // ... Add together all chars.\n ","for (int i = 0; i < obj.Length; i++)\n {\n if (obj[i] != '-')\n {\n code += obj[i];\n }\n }\n return code;\n }\n}","A warning."," The code has some problems. Its implementation of GetHashCode is slow and would become slower on many keys. But the code shows the concept. ","And: ","It avoids string allocations. I have found this is often a key to good performance.","Fuzzy, continued."," Next, we use the CustomComparer we created. This Main method shows how hyphens are ignored in the keys of a Dictionary that uses this comparer. ","Main ","main","Var ","var","Here: ","All three lookups return the correct value. Some unusual cases, not shown, may not work correctly (such as trailing hyphens).","C# program that uses Dictionary, CustomComparer","\n\nusing System;\nusing System.Collections.Generic;\n\nclass Program\n{\n static void Main()\n {","\n // ... Add data to dictionary.\n ","var dictionary = new ","Dictionary","<string, int>(new ","CustomComparer","());\n dictionary[","\"cat-1\"","] = 1;\n dictionary[\"cat-2\"] = 2;\n dictionary[\"dog-bark\"] = 10;\n dictionary[\"dog-woof\"] = 20;","\n\n // ... Lookup values, ignoring hyphens.\n ","Console.WriteLine(dictionary[","\"cat1\"","]);\n Console.WriteLine(dictionary[","\"cat-1\"","]);\n Console.WriteLine(dictionary[\"dog--bark\"]);\n }\n}\n\n","Output","\n\n1\n1\n10","Fuzzy, uses."," This code has many possible uses. It can potentially eliminate many Substring, Replace or ToLower calls. You can simply use a hashing function, with no new strings. ","Substring ","substring","Replace ","replace","ToLower ","tolower","Tip: ","You could even implement a simple language using this hashing mechanism. It could process strings without modifying them.","In my experiments,"," avoiding string allocations (caused by Substring or similar methods) is usually a performance win. And this style of IEqualityComparer tends to benefit performance. ","Optimization ","optimization","GetHashCode."," This method can be optimized. Try multiplying its result by an important character in the string. Also, there is an easy way to test how selective your hash numbers are. ","GetHashCode ","gethashcode","Test: ","Increment a static int field each time Equals is called. With a better hash code, Equals is called fewer times.","Tip: ","With a more selective hash, the internal Dictionary methods need to search fewer values with Equals, so it is called less.","With IEqualityComparer,"," we look up strings based on the results of a method. We apply fuzzy matching, or any other transformation before comparing keys. We need not modify those keys. ","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","3679700504","data-ad-format","link","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","url(data:image/png;base64,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)","url(data:image/jpeg;base64,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)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAACCAgMAAADasxWRAAAADFBMVEX/6Nn///+VlZX29va5ksB5AAAASElEQVR4AWPACZj/f0DmjkqOSjKtQgcLyJccZiEE9SOmP8mXHEaBMBoIo4EwGggryJccvvVKKAogTnJUclRyVHLklgmjkqOSAALWyrsxEHLDAAAAAElFTkSuQmCC)"]

["url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAB4BAMAAADS7QcCAAAAGFBMVEX///95cvSaspm/zr6ppPiuqvilofiMhfa6xS0cAAAAfUlEQVR42u3XsQmAMBgF4V9xAAOCfVxAdAEdQtwg1il0fsHS8IpIsLob4OvPnKy1V7WXWR9ER8oMs8hbZ6ImZUYTTTAwMDAwMDAwMDAwMDAfmX4T7Tl3V+o1iYieKifLYs5NFLOYxUQrDAwMDAwMDAwMDAwMzA/MFUSx0GveDtlxrtujxRkAAAAASUVORK5CYII=)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA9CAAAAADNbHnoAAADxUlEQVR4XtWasYrjMBCG70nnCfQEegCXW6kMuEhnDrZyswRcpJlAGhcuVQU3KQxuDIaA7rRaZ+aId1bcLor8Nd5u9EX6pdHavy7ogUDjGOjZQcCJXBENLFQulqltjAGCRsCIHODPiMyIGha0i8OWQGQi4s5HICYXwWAAMhSxFRBthEerIEuR3gBRuy/pAXITuYXYhogo8BRfp1zlJzKER9AtyVpi3JHAS13Xr5668diniXQhI8GgDQ/rBG72fFgs1GlyAilFZnSeBjy65+XWmVs6c/TgXC4iI07+YcIy6QrwGEGkQ0QFgd7lI2LxShHZY/VVSHpEPNLulo9Ih5YiUi9j7MUJeaUJyUcEsbtHBBBbOSSh+J5yl43IhOjTXoJHI9ogUooiu6xEaMmPzoX07hDPIfVqcyIWES9Lw1Eh4lvwHrYm0iKiXSJyoB3ptDGRm3dtPyKiEO9przYmMqJn1uAp3kXC33pDIlTkIyIlN5+2JdIhUi4a9NRBpBVEqvxEzsgGZrlVHXGy22xEZuSxmNDTgXi5upIrVNmIXJFvVB/zU0ghCVOic+p+qUaz1AiJ2cvr5tbRfUT1GYhQ1n8vI79Q2qW+8dodYKHqf0xkvHjYBbp+awI7j5ZEkK8l50aeduMEKvgXZapPL72RA/wV5EBmXSSk+0zpRp43JzAoeKQaBHUQ+LZIj54D7bchJC8Rm+sJVlCnJ4lYfoqc7rl8FUIim8DpCSI0AbSVDjzt5f/8z7RNL7IWiRvfjpWTmZoVFTU9QWTkETFsjnTscdc2RguvFeJEvnmOPCaCUmMoNVHMeNgrCOgnHIiWR6RlPUsV3UpR2I6LSZ9epOUVBtZF1vTjxnFhLXGTXOTGB6243JHk4hhYssrkIgMtIypvedPSukhGliyTXORCwaYCPbevXSQ3VkklFSEUfE7hYhEqJRLpQWLajkgDEnY7IiVINNsR0SBhNiMygMwWRC6eGgL1X5rAfuehkOQuMuLKIUZ1FdXNXKTnDXvtiIG3kmX+IpbdRaB9aMFKOqYjmJmITidC3WG11h12KLy4FXqt4im91swt9WPh40rhyJfvaUUG/LTzvvL0VC4GSxMCp4Qi8s8+8/1MuxjOVAemtCIdj4hdic8O4i9XVzwU9GVnWhH0mHVJS2l/XCnjO3X9dmjuGAV3hrQiE78IFqtHjPjhjNBmphSRxypbyiKlSysirx535utuiheBckotIufZ8k+A2mgRRdVTidx4RNR66QOVjhLRzeSSi4xc3nzyAkixkMgi2lRN/91Xb38AHaHDzqTpdbkAAAAASUVORK5CYII=)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAACMCAMAAACZHrEMAAAAS1BMVEX/////6J3/8MH/+uv/21D/7bX/2Dz//fX/+OH/44H/9df/66n/4HP/3WL/5Y//8szV1dX7+/vGxsa2trb29va7u7vQ0NDy8vLLy8umG8PNAAACk0lEQVR4Xu3bCaoWQQwE4E6vs/5vc7v/SUVGLAxtnoidGrHrBB/FQCYNCb+Rl08vgRxYXt9eoaFb3qDhW5SGbYGGb4GGb4GGb4GGb0G+3Mjy8fP/ZJmWaZmWaVnijSy5xhtZKjR8CzR8i9LQLdDwLdDwLdDwLdDwLchxJ0v7ZyzTstzHsq013sSyrZgMRAso0BAt6TFuMjwbFp0thCSgDNbYlpqfQBmqsS2Ik0ZbWBrbYicvAzR/Zsnl70+HZ2WhUKBRFgYF+fDDFTXg6Ov2FhwSlaX1upIUfBL1DDjfpSxxrAaWzaBgDx+pgSWsBsVjD4+wqGJK6FrGarAHPCpSc+taxmsuSzKKgWW05rIEMYrx28NbMIrh7OF7txjOHt6yUQwsPppiFAOL0hCKgcVLE1UxysLTlI6FpclNW4iaoi1MTTItx+GpEdvSmqcmaYueWY4aMSxXb1qzDdOUZFigUbyBgcXS8C3Q0C1aA8vCskCDXnL0tOSOBpboMBmQo8lPmv2bBnNjrS4a7FXy65ejxWdOAQONtlxOlkZbWq40DSz4f+ZoYEHOStJ0LFutJM2uLHovXoOfppOk/ieomqKKoWpOVQxT81SR+vB9oS3KgodALBbbGl00Yn6+clGcJoPYzzrpO8VFI/brhVwUH410mUgEZbgGFuTg7OFdy0J6Fdh6RKmeGjsNAL6mvIc5Fz/MaVMeT8EvYpZSkufFkpil+F4siVWK88WSGKV4XyyJUYp1seRnWaPfxZJtyXuiXCxJrxTWxVLUlD3xLpa0JnIvCiLNYmv4Fmj4Fmj4Fmj4Fmj4FqTwLXamBZmWaZmWaZmWaZmWaZkWr4slvgYWvgYWvgYWvgYWvgYWvgYWvoZisS+W7HwFgJmnk4YUibEAAAAASUVORK5CYII=)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAA8CAMAAAA6wCQxAAAAGFBMVEX////w9f5kb9TGyu3b6P6hp+K71v8AIMVWWs88AAAErklEQVR4XtWa63LiMAxGVzf6/m+8Q0yR1SPUUmY65PtJEsfHujrm359IPw6N9/jl0L/TabHpCHc5KZwvuJjYZLH5u9sA07QFZz+Akze3AeFiwclbhtzzNvBiA4W53xKONqDED+1PHbIRTpb+HulJGxySs6e92QZnE0Pu/GLInVNuK/jN55Cb5Ugfk45Xmnw/KR+Dwa96HA6mH7t0H85V9fOy3uRHgN0ePbTI9Oa6IvWSyD2Nhl4V17vvr3PMdw33kYolVbVC5peU31XRIN08krIDTrbLORdfcKVrXotbfCDqeEXbwJShRlIlWVCxeSS1UuM+2bsdlB1bwmXa/TIq/E74Wt4KKMDFN0M0bJpwfiPAqiTHHU6wkngKbBTZKNhNwywiVoDpaNdIOFw2lI8CFzW2FwPycN4WZtXKSp90keqf/sXrSpy6+Y+qHO2uJk35kITT/d5FgbHTvnowS3TmlUridy4Mo/LLKqfFENKXj0zWAk9UTJw/SleJkq1uSTiM/7axLIYokjnkrNo3aDhm7MZwPu0uMDQ03mRA+2HIWYIQLotKpW12SpK0gPOpZ8T7qSAaZ7jgZPdiGwdHUSEcvZBwRrhxmvPXLRH6cu1PwNbNQPBTPIITmLL1booEVD6+GHgpDVdKHw0MXp+CXh7AYRz4VU8wb/OWfejLCZck1tiecHwN4UDrbbZTtuckkL7W2iebPA45kMAosBxS+mA5Jhh2DIwrpj3hst8ILrxUQ44kAqMgyyF2CJclfWjiWv+MMs0cEkmjDD2H3JyJa2PRNzEVxi8VlnRoVkDg2eSwNS4O7ww5ZkbmE7aEpmgqgSOfbHQ8i5FOKkHS5WQJR19mG9dHYeljVB+uuWSbXHYDlIX2+w8SLGGyBxzziXQhN2ZiSWSseFEygQ2SNKA+LOGScHDYhMOlWsJjPClxGWJloqNP9uHXhVwZ0l3gsLXqPBdy+ZP4wlBmuZnOKz4lhKPjJNwvQ87HkMt1WFLUJ0Tdms+ouV2Ifb1qi++Ae6GEF58g1dBdzuK76DgJhzqd75m7Zh1Dbl+2GNnYS85yvp6+5FcJ6nRdRITcUMIZco6SAaG5nMXdPX2pbDwd+eSprhmFL+EsTfwiHPtMb+CkfL0WKZMFXBty8YOQk33k8NEr5yRpZvvdyhpOay46Ydec/v9K1yz1Y7MqDgpYB9qDAs/nLWJB0NXvyOuj5lpdhtxtGa96umu2DS5ntilsKgRpQgwNOX2VH9IZcrmKL3bN+Z2SZXzuvqQOTSne1MBh2Tc4kWe7ZsX+sVPAbpSXoaFgfFph7zOdVMsFjndIkt4bvauofn+64w9t5xaKb+Hz4Z3GBpcHc4VO8gyu5pNDsacOPWRdf6tyzHCbovYfm6UcFDBl4kS1PeAsuRVaGC8f9zM55xkkqkBzBnmGs3frgK39FIQf31MsfH3FaHdv8tZwaGIIhwOPc8EpDAdk7AaAfB447lW898qzwGl7PB60EYvDCZJldP28oBDAbqeoBNkoeZ5WojtBkXvTdMJGNsJKAxVwwdXIuqO1fHPTUTHsB8B2Mjrr0j6b5hPScaviJzEbJXWv0p+JOnbh55Hhz5/D/ywbsv9huWAxbhOvjwAAAABJRU5ErkJggg==)","url(data:image/png;base64,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)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAACICAMAAAACj/MaAAAAGFBMVEW87/XI8vf5/v7X9vrz/f/n/P/s/P////8eJxHvAAAEG0lEQVR4Xu2c227jMAwFeZP0/3+82ASFW5yapA8C1UDC51oekxyldanIomMWsS4HAWNaxHjGHhgpYifM6sHMW8DoVhhtwcQbwngO4zeEsT0w4wNzErO35+2BiTvBGLcB8zD8FqzvDKMNmHhLGM9g/IYw9kKY2AETFYw/VrF0tdGASSH893sI3ue/lDP1YRIbMNxjov+CooiveG4Vlnwe0DDmIqI2oZgA44ediRIm/KdB6HfnRgJjhxLpmvwG7AczPq6gJj+TYyRMkpbT1MhpL3hSKi1horRwILXgPaBUhjDMBmz+kxpTLwjeKJUTe17o79gTYMAR6GMCpuBXUFbyOyiUioMxPeceAAM7WdrHo7HnlT+Pegto3SnVvARj1dIAA+tnfRxtGOzcRG8BWzulsgpmNsxDvQW17vRxcwPGzk31lt6rMT2S04KJk+Lnegu42upjbcFYf9kDBrQu+1gL5sDOlVpvgQdt9bEXMIbZbugt0L2tPq5hsHNrvQW0bpWqhIHO7egtkM88vIBJYGu9BbQuQjswIFtPbwGty/AUBkn7egto3aNJ/Ac123oLal2HJjDgWVvvGWIuRPgZTFNM/KyZT5tsqOwORDl24KE3QDneQsw/wdGzX8jD/woFYPbj+EOg7A9/34pixZsrG7pRoBQG1NqHgjCEWrRAJQyrFo+CMDwOL1ANQ6jFClTDsGrxAtUwvFo8CsKUavEoQYwfEGoRArEw2Mu8QDwM4vAC0TB8L6NAVYV4GPPraUlxeJhwsndHYjUHM5W3uo8jfLfwODyMAQqNEywMrzTfy9Lo2m04sgGlrZYUAm3FEV6g16slvECvV0tIgfjQc7WEF+j1ask+lFotSQTajiM9gfaoJR2BdqklpUAb1ZJCoK1qCYeiyatXGmeKcU9z6ojyZpmsQV17viyR6KNMS5nnyNZVLjEPmyZT4fQhnUrM0ya/XN7IYYbrZZ3ml9oXL5y2RmFG+OXu/dr0/Fpa8AqEQdw6MU8Y0wsstjowFxcd3/+r0i/ReoRWMO2E4/jB0naJACYZzAhta/0dJrqde21KxLyfmANmea9EfZj+gQkc5rFm5z7D+pNFph2tf8Isb6SFG3PyUmscANNG5/YHwAyGrhKtEWZm8Aajbj2YvI+ToUHNStSG8VHSo9YIE1WJ+m2A14RmWiPM8mRzIWHS1dMRXOukhR/BnZpoDTBrnGwuEEpNSpsnWgPM0qxzeRi0ELVGmAklYgfaRzJbD1ono/7QucSoP8DAHQyQAeaht8aKJC3EIQjsY1trgh2C4G5rrUNo8niIpa+WH6wxq/EDHauMQcEcMZR6Q86f4rF7n/z6wNzq6OI7w0gWeo+DwJ8j0rOA+Zzxv/tXMXxg7v/FJh8YKeJtvyYoKhhbRLA2WRGLjX+NNAFPXyaxJwAAAABJRU5ErkJggg==)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAACCCAMAAAC93eDPAAAAMFBMVEX7r11HR0f8yZHLklZZUEmyg1P8uXLjoVmLbE5pWUrAi1X+6tPVmFfyqVx4YUz//v3zEySOAAABHElEQVR4Xu3cS4rDQAxF0av6+5fsf7ed0ANDV8b1GvLOCu5AWMhg83w5UkOgpeP58k5IyKTfhIZQeyckpNKTA7GDhFiiIdb4KmZmZmZmZnadH1ysdMYHpxOc4ISbE5zgBCc4oesTKDG7WGrEZGOtGpPBWjkmlbUu+TTCNiUA4nl8gHoeB4B2S+wsF390lnuopxGqehRg1z6YmJdlRqBIp3FelgWFqp5GyOpphEu6JudleSFRxw0xs1xHxDZqR+Tc7k3dQb2syy4ruO0A2tO6dBYb8pOy62/7PWZZfttHBXCCfhy7/PXCJj+sI8vfLwwQNwwU8j0PW0ZkHyUiytiRMDMzMzMzM2v6gIRY4kDs0H/wrv/s/3/8/ED/C4gfHWoMKlwF198AAAAASUVORK5CYII=)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL8AAAA3CAMAAABq12uBAAAAMFBMVEX///+54f/wnZ39pP752trf8f+Gz/7/6P/76en+0//O/69KvP7o/9v8S/6a/krra2tKcW3cAAAC40lEQVR4XtXZ25LaMBAE0BndfYH9/78NRSWTqPG4ITLrpd9w6eEIuuwRlvdkne+RTwnqr7+zfiT/+jfz2wHJT89qyU3rAIb/jl8gffnpNxD8heFfwNz557P8yGrPLrz2Wc/zf/GF3D+f6G9ufXz/+oP8Cfyf9v0HqP+n9N/C1vH7z1XO9CeoD/fjBtaT/Agjy7pA+9+exGGN2Pvg/HNeh/iS4M+fpj/Pn2j9g5wa9IdtHaz4JD/WPx3gz6rlFtX8nLDGeybuxy41tiLg7M/HBy2Lpdx3YBe29jPFi+W+hWqfuD891L8N+nNZupR9/2R2M0fqR143lI75dcGULIvnr2a1RLns+XFOwwVhwG983IDnrxcnz/sTLhjym7RLAb/P5/604Q+H+U3qJBM+9zfwB6z/iD8vr/jj//jlCwL1H/Fj+1W1gJ/xuT9ggQ72I1Y9/4Y3cr9pDQj13/XLus7P+gs8EMAfN9sSqV/QD/V3/Jb1Vb9k4u+wkfqxQFCfYb9Fu8vgr9t8kZf9UJ8Rf4bRQTNczu7cUK1XzJ++/LQxvxgUtgAxJlK5H4AQGfQr+nEL3D8RPzlsjfll2UxR5p/MX6nfL1Aa8JMnMO7Aq7/IZKnb/ubXf8SPDcLonl/coB8KhFbu5+cXJ+Vn+/lPUGj/ub+7AEnH+CVrIRUa84vjl0E/30Jm90/u9wsURv18C4p+S+3Nk+v3C5SG/Y+zp/b+wuYfO9ZX1+/eQdu43+IdKf3xP8J/KtXx+wWSA/3FGSn25v+p+z8r2vvrzn+L4w+2uvOnlFr3x3Pvv2XLv5Tsfv/+6T3e0jfKNP4Myke7AOWBiAXntlt6/vLa8f0laDvUz59g9cISfX/YQr7frzCCkkyuP53jz84Mzb9/OoOmb/Crcwjg/edSOdKvyvh8A5Ps+QMaj/WLOnzItNOdXX96qz+LqM/nHYpViB+p6Wi/iDonYPYOI0b5IclannqPV/88d/El3i/N/yCtNHLnZQAAAABJRU5ErkJggg==)","J","url(data:image/jpeg;base64,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)","K","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAAxCAMAAABqK1L5AAAAMFBMVEX///+zzvd8rvO/1fj1+P4xiu5tpfFbnfDg6/xIk++ZvvWLtvSmxvbV5Pvr8v3K3PnaFXRJAAAA1ElEQVR4Xu3W7QbEMBBG4Xcm3/3a+7/bVZRlqEI5Vs7vhIcwE+3lQbrP4/kHN2LNfbW06zcAMDTWlFnA2LDMAsbGBwaMJTqwJDqw7HRgpQNLogOdDiwHHZjowEXqflXj7r56H2hmW43AevttMIVeA+qsRyILqE4HKrxyhwG3sO1gQPt34AQ6HJgHfMxsBQ081uBrGKC7txJbAcDbjA7scOAQHGhw4DjgQBMbWMUGtswG1iw0cMsiA5dDwgLbkrJEA/rZYpb2gGMAdRMZOIETOIETOIFfGWpGTAdlDEMAAAAASUVORK5CYII=)","url(data:image/png;base64,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)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAA8CAMAAADLy3+8AAAAGFBMVEX////++Of/8crj4t+/vr2SkZFWVFT/67CB/ywxAAAEFklEQVR4XtWbYZOzIBCDN9nF/v9//I6FzBVKGaXyOs0XW5H1ntsYRr2zWiAfWSRgJ4W/6TOzK9k1Ah+NiPWzpWbyJVB49EQsni2xZVpBJHHxbCFdzsTHQPhmNifPj0VNkrBwtpBaYVWTJEwhSafSRcIyJOmr2ZxxCZY5T+IUkoQJlyz0noQpJGnYpG+YVvjncUw4bxHYeqgp30ocEK1isqolYIcRc1DMwtyieE1OEB8awEP2IQCwJSJxQ58Mbx7hMSZDhxsiIjwivM9kXMtkfKtzNLvQsQsKUmxZ3p+5mMnYlsG5PGbbAtLTtiUH0rbBelrNZBif0cZQbDlJPDsEANsWY/OBa5hsikkE73vwNJ6NmEy5ZLcw8XiPxbTtMgPiIxMz0e1MY7VMYfCPIWFQInLX6wKwhgnfeIFi2mBIuU0jgaJiFm68nAaeykGe9Bgo7V/MLDKpwd0dZu47E9yZ5buQd9tzWIpIKTaV2WUe4eZaLlT62I0aTreYalQqTNmJmW0Tmz9JYc9tgGVWRPFt5OFdvklblHKZ0ENMKt0RICKJEzcvhAtqR8LriVPeSql8DuA5SYoyLKTklikqQheKSg/89h3Sg0QIyuzPINUv2i0VGLW0dCijNQwo3VW5lPNHKFDpShcgQZNICCqs+WG82UYZB+o2yrL5a1RXpYZDh6hko++R+IdEQBbx94iIik3MsGI2seGlbRBibbN+RIyZMJH/JOEOWKhR3YjQFi2DjhdyFARvhu0VRZzz3hsjlesClkOgExFdj/UtKeu9O9deKqjFl2YEH5KQQo3qR4S26d2CUVu2spe2YhpGhF300Jz0nGJUNn+MCFT9EAP0XeiVvZqVaBwRNn07IyQx7QgOECV027xqGMUiBmQ2DeeNHYmIMzdpB3zXMhkAZXUbEW+M6TUSgCoikDejiLCKsxKLTrpPSG2fTBCK6BKDUPea/ijhgTrhq6trS1qQxaRDxfRB4DfvAUikUl9nfLLsO/WhjgrkHXkUQLWKJS3d6TkuWVaookqe+DmPI+lZxBaRCpLO7FqEm8hG/LEmALIoCk0ZhqDUkr9DdKqheObBUSvC8m81JVkklXTam4U2k4HneE5BENlHOrw4K+RZf2HSISVfx8JR813x2IckpPE9obv39hZPX/QmnN0unRQbnayQtshmv4bpbEYOqmSaiUaHluVrmDDwHSstfO+u1aGJCGKOaYDUjC1lcmihq2piJiPYQfr/TEp4f7fzuAM45DzYDUzeRcrC2bN0kO5gMo+UAh8K4vOlf84x65nO1CN59BZqcMy9TJx/d/44o7kX9yuRaL/DhMdkm36fCXYX0zIo2m1Mq6Bo9zEtgqLdx7QozmG/yGTgqEk/xzSmotm9TCv+ZP5nmSSg+teGH9U/EvuFGjU3drsAAAAASUVORK5CYII=)"]