{"id":4575,"date":"2025-12-19T07:11:30","date_gmt":"2025-12-19T07:11:30","guid":{"rendered":"https:\/\/flj-pcb.com\/?p=4575"},"modified":"2025-12-19T08:07:37","modified_gmt":"2025-12-19T08:07:37","slug":"about-pcb-drill-compensation-simple-english","status":"publish","type":"post","link":"https:\/\/flj-pcb.com\/szl\/about-pcb-drill-compensation-simple-english\/","title":{"rendered":"About PCB Drill Compensation"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"4575\" class=\"elementor elementor-4575\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-733c0b06 e-flex e-con-boxed e-con e-parent\" data-id=\"733c0b06\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6269846d elementor-widget elementor-widget-text-editor\" data-id=\"6269846d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"49\" data-end=\"461\">There are no great individuals, only great teams. With the team working together, the first-stage PCB CAM automation project for <strong data-start=\"178\" data-end=\"194\">net handling<\/strong> and <strong data-start=\"199\" data-end=\"217\">drill handling<\/strong> is done. Next, we can move on to the PCB rules engine. Here I talk about drill compensation in PCB engineering. As a PCB engineering developer, you should know what it is and why it works. I share the key points about drill compensation below.<\/p>\n<hr data-start=\"463\" data-end=\"466\" \/>\n<h2 data-start=\"468\" data-end=\"507\">1. Why do we compensate drill sizes?<\/h2>\n<p data-start=\"509\" data-end=\"870\">The hole sizes in the PCB files the customer gives usually mean the <em data-start=\"577\" data-end=\"584\">final<\/em> hole size. During PCB production, copper is plated inside the holes (or the holes get a surface finish such as HASL, ENIG, OSP, etc.). This makes the hole smaller. To make sure the final hole size meets the requirement, the CAM step corrects the drill size. This is drill compensation.<\/p>\n<p data-start=\"872\" data-end=\"1171\"><strong data-start=\"872\" data-end=\"889\">Real example:<\/strong><br data-start=\"889\" data-end=\"892\" \/>Final hole size: <strong data-start=\"909\" data-end=\"920\">1.00 mm<\/strong>. Surface finish: <strong data-start=\"938\" data-end=\"946\">ENIG<\/strong> (nickel thickness 2.54 \u00b5m, gold thickness 0.0254 \u00b5m). Follow IPC Class II and the average plated copper thickness is <strong data-start=\"1064\" data-end=\"1073\">20 \u00b5m<\/strong>. If we use <strong data-start=\"1085\" data-end=\"1096\">0.10 mm<\/strong> as the compensation value, the CAM team will pick a <strong data-start=\"1149\" data-end=\"1160\">1.10 mm<\/strong> drill bit.<\/p>\n<p data-start=\"872\" data-end=\"1171\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-4578\" src=\"https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/Real-example.webp\" alt=\"Real example\" width=\"336\" height=\"297\" srcset=\"https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/Real-example.webp 336w, https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/Real-example-300x265.webp 300w, https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/Real-example-14x12.webp 14w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/p>\n<hr data-start=\"1173\" data-end=\"1176\" \/>\n<h2 data-start=\"1178\" data-end=\"1216\">2. How do we do drill compensation?<\/h2>\n<p data-start=\"1218\" data-end=\"1445\">First, be clear about the three key parameters for drill compensation:<br data-start=\"1288\" data-end=\"1291\" \/><strong data-start=\"1291\" data-end=\"1298\">(1)<\/strong> Drill bit increment,<br data-start=\"1319\" data-end=\"1322\" \/><strong data-start=\"1322\" data-end=\"1329\">(2)<\/strong> Compensation value,<br data-start=\"1349\" data-end=\"1352\" \/><strong data-start=\"1352\" data-end=\"1359\">(3)<\/strong> Step-up threshold (advance value).<br data-start=\"1394\" data-end=\"1397\" \/>These three determine how to apply compensation.<\/p>\n<h3 data-start=\"1447\" data-end=\"1475\">1) Drill bit increment<\/h3>\n<p data-start=\"1476\" data-end=\"1773\">This depends on the drill bits the company buys. The industry common increment is <strong data-start=\"1558\" data-end=\"1567\">50 \u00b5m<\/strong>. Typical drill sizes range from <strong data-start=\"1600\" data-end=\"1611\">0.10 mm<\/strong> to <strong data-start=\"1615\" data-end=\"1626\">6.35 mm<\/strong>. The usual smallest step between drill bits is <strong data-start=\"1674\" data-end=\"1685\">0.05 mm<\/strong>. So the drill library has sizes like <strong data-start=\"1723\" data-end=\"1761\">0.10 mm, 0.15 mm, 0.20 mm, 0.25 mm<\/strong>, and so on.<\/p>\n<h3 data-start=\"1775\" data-end=\"1802\">2) Compensation value<\/h3>\n<p data-start=\"1803\" data-end=\"1952\">The process team sets the compensation rules based on factory test results. Compensation values do not vary much across the industry. Common rules:<\/p>\n<ul data-start=\"1953\" data-end=\"2098\">\n<li data-start=\"1953\" data-end=\"2014\">\n<p data-start=\"1955\" data-end=\"2014\"><strong data-start=\"1955\" data-end=\"1975\">Boards with HASL<\/strong> (spray tin): <strong data-start=\"1989\" data-end=\"2011\">compensate 0.15 mm<\/strong>.<\/p>\n<\/li>\n<li data-start=\"2015\" data-end=\"2098\">\n<p data-start=\"2017\" data-end=\"2098\"><strong data-start=\"2017\" data-end=\"2040\">Boards without HASL<\/strong> (ENIG, immersion tin, OSP, etc.): <strong data-start=\"2075\" data-end=\"2097\">compensate 0.10 mm<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"2100\" data-end=\"2142\">3) Step-up threshold (advance value)<\/h3>\n<p data-start=\"2143\" data-end=\"2403\">The process team also sets the strategy for picking the drill bit, similar to a rounding rule. For example, when the increment is <strong data-start=\"2273\" data-end=\"2282\">20 \u00b5m<\/strong>, if the remainder after dividing by the increment is <strong data-start=\"2336\" data-end=\"2347\">\u2265 20 \u00b5m<\/strong>, you round up 50 \u00b5m; otherwise you keep the lower size.<\/p>\n<p data-start=\"2405\" data-end=\"2737\"><strong data-start=\"2405\" data-end=\"2417\">Example:<\/strong><br data-start=\"2417\" data-end=\"2420\" \/>Final hole size = <strong data-start=\"2438\" data-end=\"2450\">1.025 mm<\/strong>, compensation = <strong data-start=\"2467\" data-end=\"2478\">0.10 mm<\/strong>, so compensated size = <strong data-start=\"2502\" data-end=\"2514\">1.125 mm<\/strong>. But there is no <strong data-start=\"2532\" data-end=\"2544\">1.125 mm<\/strong> drill in the library. Use the step-up rule. The remainder of 1.125 mm when compared to the 0.05 mm step is <strong data-start=\"2652\" data-end=\"2661\">25 \u00b5m<\/strong>. Since <strong data-start=\"2669\" data-end=\"2686\">25 \u00b5m &gt; 20 \u00b5m<\/strong>, round up by 50 \u00b5m and choose a <strong data-start=\"2719\" data-end=\"2730\">1.15 mm<\/strong> drill.<\/p>\n<hr data-start=\"2739\" data-end=\"2742\" \/>\n<h3 data-start=\"2744\" data-end=\"2782\">Actual drill compensation examples<\/h3>\n<p data-start=\"2784\" data-end=\"2850\">Assume: drill increment = <strong data-start=\"2810\" data-end=\"2819\">50 \u00b5m<\/strong>, step-up threshold = <strong data-start=\"2841\" data-end=\"2850\">20 \u00b5m<\/strong><\/p>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"2852\" data-end=\"3097\">\n<thead data-start=\"2852\" data-end=\"2947\">\n<tr data-start=\"2852\" data-end=\"2947\">\n<th data-start=\"2852\" data-end=\"2868\" data-col-size=\"sm\">Original hole<\/th>\n<th data-start=\"2868\" data-end=\"2883\" data-col-size=\"sm\">Compensation<\/th>\n<th data-start=\"2883\" data-end=\"2904\" data-col-size=\"sm\">After compensation<\/th>\n<th data-start=\"2904\" data-end=\"2919\" data-col-size=\"sm\">Integer part<\/th>\n<th data-start=\"2919\" data-end=\"2931\" data-col-size=\"sm\">Remainder<\/th>\n<th data-start=\"2931\" data-end=\"2947\" data-col-size=\"sm\">Drill chosen<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"2980\" data-end=\"3097\">\n<tr data-start=\"2980\" data-end=\"3038\">\n<td data-start=\"2980\" data-end=\"2991\" data-col-size=\"sm\">1.025 mm<\/td>\n<td data-start=\"2991\" data-end=\"2998\" data-col-size=\"sm\">0.10<\/td>\n<td data-start=\"2998\" data-end=\"3009\" data-col-size=\"sm\">1.125 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"3009\" data-end=\"3016\">1.10<\/td>\n<td data-col-size=\"sm\" data-start=\"3016\" data-end=\"3027\">0.025 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"3027\" data-end=\"3038\">1.15 mm<\/td>\n<\/tr>\n<tr data-start=\"3039\" data-end=\"3097\">\n<td data-start=\"3039\" data-end=\"3050\" data-col-size=\"sm\">1.016 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"3050\" data-end=\"3057\">0.10<\/td>\n<td data-col-size=\"sm\" data-start=\"3057\" data-end=\"3068\">1.116 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"3068\" data-end=\"3075\">1.10<\/td>\n<td data-col-size=\"sm\" data-start=\"3075\" data-end=\"3086\">0.016 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"3086\" data-end=\"3097\">1.10 mm<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4 data-start=\"3099\" data-end=\"3140\">How to compute the chosen drill size<\/h4>\n<p data-start=\"3141\" data-end=\"3241\">Break the compensated hole size into an integer part and a remainder part using the drill increment:<\/p>\n<p data-start=\"3243\" data-end=\"3396\">Take <strong data-start=\"3248\" data-end=\"3260\">1.125 mm<\/strong> as an example:<br data-start=\"3275\" data-end=\"3278\" \/>1.125 \/ 0.05 = 22.5 \u2192 floor to 22 \u2192 integer part = 22 \u00d7 0.05 = <strong data-start=\"3341\" data-end=\"3352\">1.10 mm<\/strong>.<br data-start=\"3353\" data-end=\"3356\" \/>Remainder = 1.125 % 0.05 = <strong data-start=\"3383\" data-end=\"3395\">0.025 mm<\/strong>.<\/p>\n<p data-start=\"3398\" data-end=\"3475\">Then compare the remainder with the step-up threshold (for example, 20 \u00b5m):<\/p>\n<ul data-start=\"3476\" data-end=\"3607\">\n<li data-start=\"3476\" data-end=\"3542\">\n<p data-start=\"3478\" data-end=\"3542\">If remainder &gt; threshold, drill size = integer part + 0.05 mm.<\/p>\n<\/li>\n<li data-start=\"3543\" data-end=\"3607\">\n<p data-start=\"3545\" data-end=\"3607\">If remainder \u2264 threshold, drill size = integer part + 0.00 mm.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3609\" data-end=\"3612\" \/>\n<h3 data-start=\"3614\" data-end=\"3653\">Summary about the step-up threshold<\/h3>\n<p data-start=\"3654\" data-end=\"3897\">When the drill increment is <strong data-start=\"3682\" data-end=\"3691\">50 \u00b5m<\/strong>, the step-up threshold is critical. It performs a second correction of the compensated drill size. It decides whether to \u201cstep up\u201d or \u201cstay.\u201d Changing this threshold directly changes the chosen drill size.<\/p>\n<p data-start=\"3899\" data-end=\"3943\"><strong data-start=\"3899\" data-end=\"3943\">More examples (drill increment = 50 \u00b5m):<\/strong><\/p>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"3945\" data-end=\"4209\">\n<thead data-start=\"3945\" data-end=\"4041\">\n<tr data-start=\"3945\" data-end=\"4041\">\n<th data-start=\"3945\" data-end=\"3961\" data-col-size=\"sm\">Original hole<\/th>\n<th data-start=\"3961\" data-end=\"3976\" data-col-size=\"sm\">Compensation<\/th>\n<th data-start=\"3976\" data-end=\"3990\" data-col-size=\"sm\">After comp.<\/th>\n<th data-start=\"3990\" data-end=\"4000\" data-col-size=\"sm\">Integer<\/th>\n<th data-start=\"4000\" data-end=\"4012\" data-col-size=\"sm\">Remainder<\/th>\n<th data-start=\"4012\" data-end=\"4032\" data-col-size=\"sm\">Step-up threshold<\/th>\n<th data-start=\"4032\" data-end=\"4041\" data-col-size=\"sm\">Drill<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"4079\" data-end=\"4209\">\n<tr data-start=\"4079\" data-end=\"4143\">\n<td data-start=\"4079\" data-end=\"4090\" data-col-size=\"sm\">1.022 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4090\" data-end=\"4096\">0.1<\/td>\n<td data-col-size=\"sm\" data-start=\"4096\" data-end=\"4107\">1.122 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4107\" data-end=\"4114\">1.10<\/td>\n<td data-col-size=\"sm\" data-start=\"4114\" data-end=\"4125\">0.022 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4125\" data-end=\"4132\">0.02<\/td>\n<td data-col-size=\"sm\" data-start=\"4132\" data-end=\"4143\">1.15 mm<\/td>\n<\/tr>\n<tr data-start=\"4144\" data-end=\"4209\">\n<td data-start=\"4144\" data-end=\"4155\" data-col-size=\"sm\">1.022 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4155\" data-end=\"4161\">0.1<\/td>\n<td data-col-size=\"sm\" data-start=\"4161\" data-end=\"4172\">1.122 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4172\" data-end=\"4179\">1.10<\/td>\n<td data-col-size=\"sm\" data-start=\"4179\" data-end=\"4190\">0.022 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"4190\" data-end=\"4198\">0.025<\/td>\n<td data-col-size=\"sm\" data-start=\"4198\" data-end=\"4209\">1.10 mm<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr data-start=\"4211\" data-end=\"4214\" \/>\n<h3 data-start=\"4216\" data-end=\"4266\">Personal view on setting the step-up threshold<\/h3>\n<p data-start=\"4267\" data-end=\"4575\"><strong data-start=\"4267\" data-end=\"4285\">Pros and cons:<\/strong> After compensation, if the final hole is a little larger, at least the part can be inserted. If the hole is too small, the part cannot be inserted. So we usually set the step-up threshold to <strong data-start=\"4477\" data-end=\"4486\">20 \u00b5m<\/strong> instead of <strong data-start=\"4498\" data-end=\"4507\">25 \u00b5m<\/strong>. The exact choice should match each process and compensation value.<\/p>\n<p data-start=\"4577\" data-end=\"4862\"><strong data-start=\"4577\" data-end=\"4614\">Combined with compensation value:<\/strong> For boards with HASL where compensation is <strong data-start=\"4658\" data-end=\"4669\">0.15 mm<\/strong>, you already \u201cover-compensate\u201d a bit and the final holes tend to be slightly large. In that case, a step-up threshold of <strong data-start=\"4791\" data-end=\"4800\">25 \u00b5m<\/strong> can also work. Use the \u201cnearest\u201d rule when picking the drill.<\/p>\n<hr data-start=\"4864\" data-end=\"4867\" \/>\n<h2 data-start=\"4869\" data-end=\"4943\">3. How to ensure final hole size meets requirements after compensation?<\/h2>\n<h3 data-start=\"4945\" data-end=\"4983\">Method 1: Buy special drill bits<\/h3>\n<p data-start=\"4984\" data-end=\"5207\">Standard drill increment is <strong data-start=\"5012\" data-end=\"5021\">50 \u00b5m<\/strong> (0.05 mm steps like 1.00, 1.05, 1.10, 1.15 mm). With a PTH tolerance of \u00b13 mil, a 50 \u00b5m drill set can cover the tolerance. If the tolerance is smaller than that, use special drill bits.<\/p>\n<p data-start=\"5209\" data-end=\"5352\"><strong data-start=\"5209\" data-end=\"5222\">Example 1<\/strong> \u2014 Compare 50 \u00b5m vs 25 \u00b5m increments:<br data-start=\"5259\" data-end=\"5262\" \/>Original hole = <strong data-start=\"5278\" data-end=\"5290\">0.922 mm<\/strong>, compensation = <strong data-start=\"5307\" data-end=\"5318\">0.10 mm<\/strong>, compensated size = <strong data-start=\"5339\" data-end=\"5351\">1.022 mm<\/strong>.<\/p>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"5354\" data-end=\"5545\">\n<thead data-start=\"5354\" data-end=\"5422\">\n<tr data-start=\"5354\" data-end=\"5422\">\n<th data-start=\"5354\" data-end=\"5365\" data-col-size=\"sm\">Original<\/th>\n<th data-start=\"5365\" data-end=\"5380\" data-col-size=\"sm\">Compensation<\/th>\n<th data-start=\"5380\" data-end=\"5394\" data-col-size=\"sm\">Compensated<\/th>\n<th data-start=\"5394\" data-end=\"5406\" data-col-size=\"sm\">Increment<\/th>\n<th data-start=\"5406\" data-end=\"5422\" data-col-size=\"sm\">Drill chosen<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"5450\" data-end=\"5545\">\n<tr data-start=\"5450\" data-end=\"5496\">\n<td data-start=\"5450\" data-end=\"5458\" data-col-size=\"sm\">0.922<\/td>\n<td data-col-size=\"sm\" data-start=\"5458\" data-end=\"5465\">0.10<\/td>\n<td data-col-size=\"sm\" data-start=\"5465\" data-end=\"5473\">1.022<\/td>\n<td data-col-size=\"sm\" data-start=\"5473\" data-end=\"5488\">0.05 (50 \u00b5m)<\/td>\n<td data-col-size=\"sm\" data-start=\"5488\" data-end=\"5496\">1.05<\/td>\n<\/tr>\n<tr data-start=\"5497\" data-end=\"5545\">\n<td data-start=\"5497\" data-end=\"5505\" data-col-size=\"sm\">0.922<\/td>\n<td data-start=\"5505\" data-end=\"5512\" data-col-size=\"sm\">0.10<\/td>\n<td data-col-size=\"sm\" data-start=\"5512\" data-end=\"5520\">1.022<\/td>\n<td data-col-size=\"sm\" data-start=\"5520\" data-end=\"5536\">0.025 (25 \u00b5m)<\/td>\n<td data-col-size=\"sm\" data-start=\"5536\" data-end=\"5545\">1.025<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p data-start=\"5547\" data-end=\"5689\">Difference: 1.050 \u2212 1.022 = 0.028 mm; 1.025 \u2212 1.022 = 0.003 mm. The smaller difference is better, so <strong data-start=\"5648\" data-end=\"5660\">1.025 mm<\/strong> (25 \u00b5m increment) is better.<\/p>\n<p data-start=\"5691\" data-end=\"5818\"><strong data-start=\"5691\" data-end=\"5704\">Example 2<\/strong> \u2014 50 \u00b5m vs special drill:<br data-start=\"5730\" data-end=\"5733\" \/>Original hole = <strong data-start=\"5749\" data-end=\"5761\">0.611 mm<\/strong>, compensation = <strong data-start=\"5778\" data-end=\"5789\">0.10 mm<\/strong>, compensated = <strong data-start=\"5805\" data-end=\"5817\">0.711 mm<\/strong>.<\/p>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"5820\" data-end=\"6018\">\n<thead data-start=\"5820\" data-end=\"5895\">\n<tr data-start=\"5820\" data-end=\"5895\">\n<th data-start=\"5820\" data-end=\"5831\" data-col-size=\"sm\">Original<\/th>\n<th data-start=\"5831\" data-end=\"5846\" data-col-size=\"sm\">Compensation<\/th>\n<th data-start=\"5846\" data-end=\"5860\" data-col-size=\"sm\">Compensated<\/th>\n<th data-start=\"5860\" data-end=\"5879\" data-col-size=\"sm\">Increment \/ Type<\/th>\n<th data-start=\"5879\" data-end=\"5895\" data-col-size=\"sm\">Drill chosen<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"5923\" data-end=\"6018\">\n<tr data-start=\"5923\" data-end=\"5969\">\n<td data-start=\"5923\" data-end=\"5931\" data-col-size=\"sm\">0.611<\/td>\n<td data-col-size=\"sm\" data-start=\"5931\" data-end=\"5938\">0.10<\/td>\n<td data-col-size=\"sm\" data-start=\"5938\" data-end=\"5946\">0.711<\/td>\n<td data-col-size=\"sm\" data-start=\"5946\" data-end=\"5961\">0.05 (50 \u00b5m)<\/td>\n<td data-col-size=\"sm\" data-start=\"5961\" data-end=\"5969\">0.70<\/td>\n<\/tr>\n<tr data-start=\"5970\" data-end=\"6018\">\n<td data-start=\"5970\" data-end=\"5978\" data-col-size=\"sm\">0.611<\/td>\n<td data-col-size=\"sm\" data-start=\"5978\" data-end=\"5985\">0.10<\/td>\n<td data-col-size=\"sm\" data-start=\"5985\" data-end=\"5993\">0.711<\/td>\n<td data-col-size=\"sm\" data-start=\"5993\" data-end=\"6009\">Special drill<\/td>\n<td data-col-size=\"sm\" data-start=\"6009\" data-end=\"6018\">0.711<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p data-start=\"6020\" data-end=\"6161\">Difference: 0.700 \u2212 0.711 = \u22120.011 mm; 0.711 \u2212 0.711 = 0.000 mm. The smaller difference is better. So the <strong data-start=\"6126\" data-end=\"6152\">0.711 mm special drill<\/strong> is best.<\/p>\n<h3 data-start=\"6163\" data-end=\"6206\">Method 2: Improve process and equipment<\/h3>\n<ul data-start=\"6207\" data-end=\"6752\">\n<li data-start=\"6207\" data-end=\"6296\">\n<p data-start=\"6209\" data-end=\"6296\">Add a second board plating step to reduce uneven thickness from pattern distribution.<\/p>\n<\/li>\n<li data-start=\"6297\" data-end=\"6395\">\n<p data-start=\"6299\" data-end=\"6395\">Use negative photo direct-etching and plate the whole board to reduce uneven copper thickness.<\/p>\n<\/li>\n<li data-start=\"6396\" data-end=\"6538\">\n<p data-start=\"6398\" data-end=\"6538\">Lower the current density (typical is 19 ASF); slightly lower current density can improve plating uniformity but will extend plating time.<\/p>\n<\/li>\n<li data-start=\"6539\" data-end=\"6752\">\n<p data-start=\"6541\" data-end=\"6752\">Upgrade to a horizontal plating line. Vertical plating lines often give thicker copper at the hole edge and thinner copper at the hole center for high aspect-ratio holes. A horizontal line can reduce that issue.<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"6754\" data-end=\"6790\">Method 3: Improve CAM strategies<\/h3>\n<ul data-start=\"6791\" data-end=\"7885\">\n<li data-start=\"6791\" data-end=\"7019\">\n<p data-start=\"6793\" data-end=\"7019\">For holes in isolated copper areas, apply one extra increment compensation. Isolated areas have less copper, so during plating they get higher local current density and more copper thickness; extra compensation offsets that.<\/p>\n<\/li>\n<li data-start=\"7020\" data-end=\"7361\">\n<p data-start=\"7022\" data-end=\"7361\">For designs with dense traces on one side and sparse on the other (for example, a power board), place the sparse side inward and the dense side outward, and use reversed panelization. During panel plating, areas near the board edge get higher current density and thicker plating. Reversed panelization helps balance plating distribution.<\/p>\n<\/li>\n<li data-start=\"7362\" data-end=\"7617\">\n<p data-start=\"7364\" data-end=\"7617\">When TOP and BOTTOM copper area differ a lot, use positive\/negative (yin-yang) paneling. Uneven copper area causes \u201cbell-mouth\u201d vias; the thicker the board and the more copper, the worse the effect; yin-yang paneling helps balance copper distribution.<\/p>\n<\/li>\n<li data-start=\"7618\" data-end=\"7885\">\n<p data-start=\"7620\" data-end=\"7885\">For isolated-area holes near the board edge or slots, add copper \u201cpick-up\u201d areas or copper pads near the edge or slot. Isolated holes can get too much plating thickness and become too small; extra copper near them reduces local current density and balances plating.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"7887\" data-end=\"7890\" \/>\n<h2 data-start=\"7892\" data-end=\"7952\">4. How much compensation is needed and how is it derived?<\/h2>\n<p data-start=\"7954\" data-end=\"8087\">Compensation values come from process tests. Below is one set of measured hole size changes after various steps (data from a report):<\/p>\n<p data-start=\"8089\" data-end=\"8212\"><strong data-start=\"8089\" data-end=\"8106\">Process flow:<\/strong> mechanical drilling \u2192 immersion copper \u2192 electroplating \u2192 pattern transfer \u2192 etch \u2192 AOI \u2192 wet film \u2192 HASL<\/p>\n<p data-start=\"8214\" data-end=\"8239\"><strong data-start=\"8214\" data-end=\"8237\">Process parameters:<\/strong><\/p>\n<ul data-start=\"8240\" data-end=\"8515\">\n<li data-start=\"8240\" data-end=\"8330\">\n<p data-start=\"8242\" data-end=\"8330\">Drill: drill bit size 0.95 mm, re-sharpen\/regrind 3 times, drill compensation 0.15 mm;<\/p>\n<\/li>\n<li data-start=\"8331\" data-end=\"8386\">\n<p data-start=\"8333\" data-end=\"8386\">Plating: copper thickness \u2265 18 \u00b5m, average \u2265 20 \u00b5m;<\/p>\n<\/li>\n<li data-start=\"8387\" data-end=\"8456\">\n<p data-start=\"8389\" data-end=\"8456\">HASL: final hole requirement 0.80 mm, tolerance \u00b10.08 mm (3 mil);<\/p>\n<\/li>\n<li data-start=\"8457\" data-end=\"8515\">\n<p data-start=\"8459\" data-end=\"8515\">Test: 10 panels, corner trimmed, board thickness 2.0 mm.<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"8517\" data-end=\"8546\">Hole size changes by step<\/h3>\n<p data-start=\"8548\" data-end=\"8593\"><strong data-start=\"8548\" data-end=\"8569\">1) After drilling<\/strong> \u2014 hole sizes measured<\/p>\n<ul data-start=\"8594\" data-end=\"8795\">\n<li data-start=\"8594\" data-end=\"8795\">\n<p data-start=\"8596\" data-end=\"8795\">Total 1920 holes tested (10 panels, 384 holes each). Sample: 200 holes (20 per panel). Hole range: <strong data-start=\"8695\" data-end=\"8711\">0.93\u20130.94 mm<\/strong>, average <strong data-start=\"8721\" data-end=\"8733\">0.931 mm<\/strong>.<br data-start=\"8734\" data-end=\"8737\" \/>(Then a long list of sampled values, mostly 0.93 or 0.94.)<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"8797\" data-end=\"8848\"><strong data-start=\"8797\" data-end=\"8846\">2) After patterned plating \u2014 copper thickness<\/strong><\/p>\n<ul data-start=\"8849\" data-end=\"8999\">\n<li data-start=\"8849\" data-end=\"8999\">\n<p data-start=\"8851\" data-end=\"8999\">For each panel, test 10 holes. Copper thickness range <strong data-start=\"8905\" data-end=\"8917\">18\u201331 \u00b5m<\/strong>, meeting \u226518 \u00b5m and average \u226520 \u00b5m.<br data-start=\"8953\" data-end=\"8956\" \/>(Then many sample copper thickness values.)<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"9001\" data-end=\"9045\"><strong data-start=\"9001\" data-end=\"9043\">3) After patterned plating \u2014 hole size<\/strong><\/p>\n<ul data-start=\"9046\" data-end=\"9176\">\n<li data-start=\"9046\" data-end=\"9176\">\n<p data-start=\"9048\" data-end=\"9176\">Total 1920 holes, sample 200. Hole range: <strong data-start=\"9090\" data-end=\"9106\">0.84\u20130.88 mm<\/strong>, average <strong data-start=\"9116\" data-end=\"9128\">0.858 mm<\/strong>.<br data-start=\"9129\" data-end=\"9132\" \/>(Then many sample values, mostly 0.85\u20130.88.)<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"9178\" data-end=\"9209\"><strong data-start=\"9178\" data-end=\"9195\">4) After HASL<\/strong> \u2014 hole size<\/p>\n<ul data-start=\"9210\" data-end=\"9322\">\n<li data-start=\"9210\" data-end=\"9322\">\n<p data-start=\"9212\" data-end=\"9322\">Total 1920 holes, sample 200. Hole range: <strong data-start=\"9254\" data-end=\"9270\">0.82\u20130.86 mm<\/strong>, average <strong data-start=\"9280\" data-end=\"9292\">0.836 mm<\/strong>.<br data-start=\"9293\" data-end=\"9296\" \/>(Then many sample values.)<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"9324\" data-end=\"9340\"><strong data-start=\"9324\" data-end=\"9340\">Test summary<\/strong><\/p>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"9342\" data-end=\"9531\">\n<thead data-start=\"9342\" data-end=\"9378\">\n<tr data-start=\"9342\" data-end=\"9378\">\n<th data-start=\"9342\" data-end=\"9349\" data-col-size=\"sm\">Step<\/th>\n<th data-start=\"9349\" data-end=\"9362\" data-col-size=\"sm\">Hole range<\/th>\n<th data-start=\"9362\" data-end=\"9378\" data-col-size=\"sm\">Average hole<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"9395\" data-end=\"9531\">\n<tr data-start=\"9395\" data-end=\"9439\">\n<td data-start=\"9395\" data-end=\"9412\" data-col-size=\"sm\">After drilling<\/td>\n<td data-start=\"9412\" data-end=\"9427\" data-col-size=\"sm\">0.93\u20130.94 mm<\/td>\n<td data-start=\"9427\" data-end=\"9439\" data-col-size=\"sm\">0.931 mm<\/td>\n<\/tr>\n<tr data-start=\"9440\" data-end=\"9490\">\n<td data-start=\"9440\" data-end=\"9463\" data-col-size=\"sm\">After copper plating<\/td>\n<td data-col-size=\"sm\" data-start=\"9463\" data-end=\"9478\">0.84\u20130.88 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"9478\" data-end=\"9490\">0.858 mm<\/td>\n<\/tr>\n<tr data-start=\"9491\" data-end=\"9531\">\n<td data-start=\"9491\" data-end=\"9504\" data-col-size=\"sm\">After HASL<\/td>\n<td data-col-size=\"sm\" data-start=\"9504\" data-end=\"9519\">0.82\u20130.86 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"9519\" data-end=\"9531\">0.836 mm<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p data-start=\"9533\" data-end=\"9723\"><strong data-start=\"9533\" data-end=\"9548\">Conclusion:<\/strong> For HASL boards the drill compensation of <strong data-start=\"9591\" data-end=\"9602\">0.15 mm<\/strong> is an \u201cover-compensation\u201d and causes final holes to be larger. The best compensation value in this test is <strong data-start=\"9710\" data-end=\"9722\">0.125 mm<\/strong>.<\/p>\n<hr data-start=\"9725\" data-end=\"9728\" \/>\n<h2>5. Drill compensation code implementation (rules)<\/h2>\n<ol data-start=\"9784\" data-end=\"9817\">\n<li data-start=\"9784\" data-end=\"9817\">\n<p data-start=\"9787\" data-end=\"9817\">Compensation and step-up rules<\/p>\n<\/li>\n<\/ol>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"9819\" data-end=\"10843\">\n<thead data-start=\"9819\" data-end=\"9968\">\n<tr data-start=\"9819\" data-end=\"9968\">\n<th data-start=\"9819\" data-end=\"9828\" data-col-size=\"sm\">Aspect<\/th>\n<th data-start=\"9828\" data-end=\"9844\" data-col-size=\"sm\">Finished hole<\/th>\n<th data-start=\"9844\" data-end=\"9861\" data-col-size=\"sm\">Surface finish<\/th>\n<th data-start=\"9861\" data-end=\"9879\" data-col-size=\"sm\">Board thickness<\/th>\n<th data-start=\"9879\" data-end=\"9899\" data-col-size=\"sm\">Step-up threshold<\/th>\n<th data-start=\"9899\" data-end=\"9923\" data-col-size=\"sm\">If via copper &lt; 26 \u00b5m<\/th>\n<th data-start=\"9923\" data-end=\"9934\" data-col-size=\"sm\">26\u201337 \u00b5m<\/th>\n<th data-start=\"9934\" data-end=\"9945\" data-col-size=\"sm\">37\u201347 \u00b5m<\/th>\n<th data-start=\"9945\" data-end=\"9956\" data-col-size=\"sm\">47\u201367 \u00b5m<\/th>\n<th data-start=\"9956\" data-end=\"9968\" data-col-size=\"sm\">67\u201386 \u00b5m<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"10018\" data-end=\"10843\">\n<tr data-start=\"10018\" data-end=\"10146\">\n<td data-start=\"10018\" data-end=\"10043\" data-col-size=\"sm\">thickness ratio &lt; 12:1<\/td>\n<td data-start=\"10043\" data-end=\"10055\" data-col-size=\"sm\">\u2264 1.90 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10055\" data-end=\"10084\">HASL (leaded or lead-free)<\/td>\n<td data-col-size=\"sm\" data-start=\"10084\" data-end=\"10095\">\u2265 3.5 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10095\" data-end=\"10105\">0.01952<\/td>\n<td data-col-size=\"sm\" data-start=\"10105\" data-end=\"10113\">5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10113\" data-end=\"10121\">6 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10121\" data-end=\"10129\">7 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10129\" data-end=\"10137\">8 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10137\" data-end=\"10146\">9 mil<\/td>\n<\/tr>\n<tr data-start=\"10147\" data-end=\"10285\">\n<td data-start=\"10147\" data-end=\"10172\" data-col-size=\"sm\">thickness ratio &lt; 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10172\" data-end=\"10184\">\u2264 1.90 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10184\" data-end=\"10213\">HASL (leaded or lead-free)<\/td>\n<td data-col-size=\"sm\" data-start=\"10213\" data-end=\"10224\">&lt; 3.5 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10224\" data-end=\"10234\">0.01952<\/td>\n<td data-col-size=\"sm\" data-start=\"10234\" data-end=\"10244\">4.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10244\" data-end=\"10254\">5.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10254\" data-end=\"10264\">6.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10264\" data-end=\"10274\">7.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10274\" data-end=\"10285\">8.5 mil<\/td>\n<\/tr>\n<tr data-start=\"10286\" data-end=\"10395\">\n<td data-start=\"10286\" data-end=\"10311\" data-col-size=\"sm\">thickness ratio &lt; 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10311\" data-end=\"10323\">\u2264 1.90 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10323\" data-end=\"10340\">Other finishes<\/td>\n<td data-col-size=\"sm\" data-start=\"10340\" data-end=\"10344\">\/<\/td>\n<td data-col-size=\"sm\" data-start=\"10344\" data-end=\"10354\">0.01952<\/td>\n<td data-col-size=\"sm\" data-start=\"10354\" data-end=\"10362\">4 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10362\" data-end=\"10370\">5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10370\" data-end=\"10378\">6 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10378\" data-end=\"10386\">7 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10386\" data-end=\"10395\">8 mil<\/td>\n<\/tr>\n<tr data-start=\"10396\" data-end=\"10504\">\n<td data-start=\"10396\" data-end=\"10421\" data-col-size=\"sm\">thickness ratio &lt; 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10421\" data-end=\"10433\">&gt; 1.90 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10433\" data-end=\"10440\">HASL<\/td>\n<td data-col-size=\"sm\" data-start=\"10440\" data-end=\"10444\">\/<\/td>\n<td data-col-size=\"sm\" data-start=\"10444\" data-end=\"10453\">0.0246<\/td>\n<td data-col-size=\"sm\" data-start=\"10453\" data-end=\"10463\">5.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10463\" data-end=\"10473\">6.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10473\" data-end=\"10483\">7.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10483\" data-end=\"10493\">8.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10493\" data-end=\"10504\">9.5 mil<\/td>\n<\/tr>\n<tr data-start=\"10505\" data-end=\"10624\">\n<td data-start=\"10505\" data-end=\"10530\" data-col-size=\"sm\">thickness ratio &lt; 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10530\" data-end=\"10542\">&gt; 1.90 mm<\/td>\n<td data-col-size=\"sm\" data-start=\"10542\" data-end=\"10559\">Other finishes<\/td>\n<td data-col-size=\"sm\" data-start=\"10559\" data-end=\"10563\">\/<\/td>\n<td data-col-size=\"sm\" data-start=\"10563\" data-end=\"10573\">0.01952<\/td>\n<td data-col-size=\"sm\" data-start=\"10573\" data-end=\"10583\">4.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10583\" data-end=\"10593\">5.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10593\" data-end=\"10603\">6.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10603\" data-end=\"10613\">7.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10613\" data-end=\"10624\">8.5 mil<\/td>\n<\/tr>\n<tr data-start=\"10625\" data-end=\"10733\">\n<td data-start=\"10625\" data-end=\"10650\" data-col-size=\"sm\">thickness ratio \u2265 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10650\" data-end=\"10662\">all holes<\/td>\n<td data-col-size=\"sm\" data-start=\"10662\" data-end=\"10669\">HASL<\/td>\n<td data-col-size=\"sm\" data-start=\"10669\" data-end=\"10673\">\/<\/td>\n<td data-col-size=\"sm\" data-start=\"10673\" data-end=\"10682\">0.0246<\/td>\n<td data-col-size=\"sm\" data-start=\"10682\" data-end=\"10692\">5.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10692\" data-end=\"10702\">6.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10702\" data-end=\"10712\">7.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10712\" data-end=\"10722\">8.5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10722\" data-end=\"10733\">9.5 mil<\/td>\n<\/tr>\n<tr data-start=\"10734\" data-end=\"10843\">\n<td data-start=\"10734\" data-end=\"10759\" data-col-size=\"sm\">thickness ratio \u2265 12:1<\/td>\n<td data-col-size=\"sm\" data-start=\"10759\" data-end=\"10771\">all holes<\/td>\n<td data-col-size=\"sm\" data-start=\"10771\" data-end=\"10788\">Other finishes<\/td>\n<td data-col-size=\"sm\" data-start=\"10788\" data-end=\"10792\">\/<\/td>\n<td data-col-size=\"sm\" data-start=\"10792\" data-end=\"10802\">0.01952<\/td>\n<td data-col-size=\"sm\" data-start=\"10802\" data-end=\"10810\">5 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10810\" data-end=\"10818\">6 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10818\" data-end=\"10826\">7 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10826\" data-end=\"10834\">8 mil<\/td>\n<td data-col-size=\"sm\" data-start=\"10834\" data-end=\"10843\">9 mil<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ol start=\"2\" data-start=\"10845\" data-end=\"10953\">\n<li data-start=\"10845\" data-end=\"10953\">\n<p data-start=\"10848\" data-end=\"10953\">Special drill sizes (if tolerance &lt; 3 mil, use special drills or 25 \u00b5m increment, use nearest drill rule)<\/p>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f7e142f elementor-widget elementor-widget-code-highlight\" data-id=\"f7e142f\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-aspnet line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-aspnet\">\n\t\t\t\t\t<xmp>List<double> ContainDrillToolList = new List<double>();\r\nContainDrillToolList.AddRange(new double[] { 610, 635, 711, 838, 914, 1016, 1320, 3120 });<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ec5424b elementor-widget elementor-widget-text-editor\" data-id=\"ec5424b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>3. Drill Compensation Code<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3dfeb51 elementor-widget elementor-widget-code-highlight\" data-id=\"3dfeb51\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-csharp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-csharp\">\n\t\t\t\t\t<xmp>\/\/\/<summary>\r\n\/\/\/ Calculate the drill bit diameter based on drill compensation parameters\r\n\/\/\/<\/summary>\r\n\/\/\/<param name=\"ToolInfo\">Drill tool basic information<\/param>\r\n\/\/\/<param name=\"UpParam\">Drill compensation parameters<\/param>\r\n\/\/\/<param name=\"ContainDrillToolList\">Special drill bit diameter list<\/param>\r\n\/\/\/<returns>Return 1 if calculation is successful<\/returns>\r\npublic static int getDrillUpSize(Mod_tool ToolInfo, gToolUpParam UpParam, List<double> ContainDrillToolList)\r\n{\r\n    if (ContainDrillToolList == null) ContainDrillToolList = new List<double>();\r\n    gToolUpParamHole UpParamHole = new G_Helper.gToolUpParamHole();\r\n    switch (ToolInfo.type)\r\n    {\r\n        case \"via\":\r\n            UpParamHole = UpParam.Via;\r\n            break;\r\n        case \"plate\":\r\n            UpParamHole = UpParam.Pth;\r\n            break;\r\n        case \"nplate\":\r\n            UpParamHole = UpParam.Npth;\r\n            break;\r\n    }\r\n    ToolInfo.max_tol = Math.Round(UpParamHole.Max_Tol, 0);\r\n    ToolInfo.min_tol = Math.Round(UpParamHole.Min_Tol, 0);\r\n    if (ToolInfo.finish_size < 50)\r\n    {\r\n        ToolInfo.finish_size = ToolInfo.drill_size;\r\n    }\r\n    double DrillSlotLevel = (ToolInfo.shape == \"slot\") ? UpParam.SlotLevel : UpParam.DrillLevel;  \/\/Drill step interval: Round holes have two levels (25\/50\u03bcm), slot holes have one level (50\u03bcm)\r\n    double UpLevel;\r\n    if (UpParam.DrillLevel > 49) \/\/When the step interval is 50\u03bcm, do not use special drill bits\r\n    {\r\n        ContainDrillToolList = new List<double>();\r\n        UpLevel = UpParamHole.UpLevel;\r\n    }\r\n    else\r\n    {\r\n        UpLevel = UpParam.DrillLevel * 0.5;   \/\/Select drill bit by half of the step interval\r\n    }\r\n\r\n    double Drillfinish_size = ToolInfo.finish_size + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \/\/Average the upper and lower tolerance\r\n    int DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal) \/ DrillSlotLevel)); \/\/Drill step count\r\n    double DrillsizeInt = DrillLevelCount * DrillSlotLevel; \/\/Round down to the nearest drill step\r\n    double DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal) % DrillSlotLevel;\/\/Remainder of drill size after step division\r\n    double DrillsizeLevel = (DrillsizeFloat > UpLevel) ? DrillSlotLevel : 0;\/\/Determine whether to round up the remainder\r\n\r\n    \/\/Check if special drill bits are included\r\n    int ContainDrillIndex = ContainDrillToolList.FindIndex(tt => (int)(Math.Floor(tt \/ DrillSlotLevel)) == DrillLevelCount);\r\n    if (ContainDrillIndex > -1)\r\n    {\r\n        double ContainDrillFloat = ContainDrillToolList[ContainDrillIndex] % DrillSlotLevel;\/\/Remainder of special drill bit size after step division\r\n        if (DrillsizeFloat > UpLevel) \/\/ e.g. 38 > 20\r\n        {\r\n            double diff1 = Math.Abs(DrillsizeFloat - DrillSlotLevel);   \/\/e.g. 40-50\r\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \/\/e.g. 40-38\r\n            DrillsizeLevel = (diff1 < diff2) ? DrillSlotLevel : ContainDrillFloat;\r\n        }\r\n        else \/\/if (ContainDrillFloat < UpLevel)\r\n        {\r\n            double diff1 = Math.Abs(DrillsizeFloat - 0);  \/\/e.g. 12-0\r\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \/\/e.g. 12-16\r\n            DrillsizeLevel = (diff1 < diff2) ? 0 : ContainDrillFloat;\r\n        }\r\n    }\r\n    ToolInfo.drill_size = DrillsizeInt + DrillsizeLevel;\r\n\r\n    double DiffDrillSizeUp = ToolInfo.drill_size - ToolInfo.finish_size;\r\n    if (ToolInfo.shape == \"slot\") \/\/ Slot length compensation\r\n    {\r\n        if (UpParam.isSlotUpLevel) \/\/Whether to round the slot length to step interval\r\n        {\r\n            Drillfinish_size = ToolInfo.slot_len + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \/\/Average the upper and lower tolerance\r\n            DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) \/ DrillSlotLevel)); \/\/ Drill step count\r\n            DrillsizeInt = DrillLevelCount * DrillSlotLevel; \/\/Round down to the nearest drill step (50\u03bcm)\r\n            DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) % DrillSlotLevel;\/\/Remainder of slot length after step division\r\n            DrillsizeLevel = (DrillsizeFloat > UpParamHole.UpLevel) ? DrillSlotLevel : 0;\/\/Determine whether to round up the remainder\r\n            ToolInfo.slot_len = DrillsizeInt + DrillsizeLevel;\r\n        }\r\n        else\r\n        {\r\n            DrillsizeInt = Math.Floor((ToolInfo.slot_len + DiffDrillSizeUp) \/ 10) * 10; \/\/ Round down to the nearest 10\u03bcm\r\n            ToolInfo.slot_len = DrillsizeInt;\r\n        }\r\n        ToolInfo.drill_size += UpParam.SlotEndNumber;  \/\/ Add suffix number for slot drill bit segmentation\r\n    }\r\n    ToolInfo.bit = Math.Round((ToolInfo.drill_size * 0.001), 3).ToString();\r\n    return 1;\r\n}\r\n\r\npublic class gToolUpParam\r\n{\r\n    \/\/\/ <summary>\r\n    \/\/\/ Compensation parameters for VIA holes (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public gToolUpParamHole Via { get; set; } = new gToolUpParamHole();\r\n    \/\/\/ <summary>\r\n    \/\/\/ Compensation parameters for PTH (Plated Through Hole) (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public gToolUpParamHole Pth { get; set; } = new gToolUpParamHole();\r\n    \/\/\/ <summary>\r\n    \/\/\/ Compensation parameters for NPTH (Non-Plated Through Hole) (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public gToolUpParamHole Npth { get; set; } = new gToolUpParamHole();\r\n    \/\/\/ <summary>\r\n    \/\/\/ Step interval for round drill holes (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double DrillLevel { get; set; } = 50;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Step interval for slot drill holes (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double SlotLevel { get; set; } = 50;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Suffix number for slot drill bit segmentation\r\n    \/\/\/ <\/summary>\r\n    public int SlotEndNumber { get; set; } = 0;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Additional compensation value for slot length (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double SlotLengthUp { get; set; } = 0;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Whether to round the slot length to step interval\r\n    \/\/\/ <\/summary>\r\n    public bool isSlotUpLevel { get; set; } = false;\r\n}\r\n\r\npublic class gToolUpParamHole\r\n{\r\n    \/\/\/ <summary>\r\n    \/\/\/ Compensation value (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double UpVal { get; set; } = 100;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Step interval threshold for rounding up (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double UpLevel { get; set; } = 25;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Upper tolerance (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double Max_Tol { get; set; } = 76;\r\n    \/\/\/ <summary>\r\n    \/\/\/ Lower tolerance (in \u03bcm)\r\n    \/\/\/ <\/summary>\r\n    public double Min_Tol { get; set; } = 76;\r\n}\r\n\r\n\/\/\/<summary>\r\n\/\/\/ Mod_tool: Drill tool attribute model\r\n\/\/\/<\/summary>\r\npublic class Mod_tool\r\n{\r\n    public int num { get; set; }\r\n    public string type { get; set; } \/\/ Hole type: via\/plate(nplate)\r\n    public string shape { get; set; } \/\/ Hole shape: round\/slot\r\n    public double finish_size { get; set; } \/\/ Finished hole size (in \u03bcm)\r\n    public double drill_size { get; set; } \/\/ Drill bit size (in \u03bcm)\r\n    public double max_tol { get; set; } \/\/ Upper tolerance (in \u03bcm)\r\n    public double min_tol { get; set; } \/\/ Lower tolerance (in \u03bcm)\r\n    public double slot_len { get; set; } \/\/ Slot length (in \u03bcm)\r\n    public string bit { get; set; } \/\/ Drill bit size (in mm, formatted string)\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-578eb26 elementor-widget elementor-widget-text-editor\" data-id=\"578eb26\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 data-start=\"10960\" data-end=\"11017\">6. Why does board thickness affect drill compensation?<\/h2>\n<p data-start=\"11019\" data-end=\"11464\">I did not understand this at first either. The main reason is the high <strong data-start=\"11090\" data-end=\"11121\">thickness-to-diameter ratio<\/strong> (board thickness divided by hole diameter). A high ratio makes the copper at the hole center thinner and the copper at the hole edge thicker. To compute the thickness-to-diameter ratio you need the board thickness value. So board thickness enters the drill compensation rules. For high thickness-to-diameter holes, the compensation is larger.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>There are no great individuals, only great teams. With the team working together, the first-stage PCB CAM automation project for [&hellip;]<\/p>","protected":false},"author":1,"featured_media":4584,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4575","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"spectra_custom_meta":{"_edit_lock":["1766131812:1"],"rank_math_internal_links_processed":["1"],"rank_math_seo_score":["15"],"_uag_custom_page_level_css":[""],"site-sidebar-layout":["default"],"site-content-layout":[""],"ast-site-content-layout":["default"],"site-content-style":["default"],"site-sidebar-style":["default"],"ast-global-header-display":[""],"ast-banner-title-visibility":[""],"ast-main-header-display":[""],"ast-hfb-above-header-display":[""],"ast-hfb-below-header-display":[""],"ast-hfb-mobile-header-display":[""],"ast-breadcrumbs-content":[""],"ast-featured-img":[""],"footer-sml-layout":[""],"theme-transparent-header-meta":[""],"adv-header-id-meta":[""],"stick-header-meta":[""],"header-above-stick-meta":[""],"header-main-stick-meta":[""],"header-below-stick-meta":[""],"astra-migrate-meta-layouts":["default"],"ast-page-background-enabled":["default"],"ast-page-background-meta":["a:3:{s:7:\"desktop\";a:12:{s:16:\"background-color\";s:25:\"var(--ast-global-color-5)\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}s:6:\"tablet\";a:12:{s:16:\"background-color\";s:0:\"\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}s:6:\"mobile\";a:12:{s:16:\"background-color\";s:0:\"\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}}"],"ast-content-background-meta":["a:3:{s:7:\"desktop\";a:12:{s:16:\"background-color\";s:25:\"var(--ast-global-color-4)\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}s:6:\"tablet\";a:12:{s:16:\"background-color\";s:25:\"var(--ast-global-color-4)\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}s:6:\"mobile\";a:12:{s:16:\"background-color\";s:25:\"var(--ast-global-color-4)\";s:16:\"background-image\";s:0:\"\";s:17:\"background-repeat\";s:6:\"repeat\";s:19:\"background-position\";s:13:\"center center\";s:15:\"background-size\";s:4:\"auto\";s:21:\"background-attachment\";s:6:\"scroll\";s:15:\"background-type\";s:0:\"\";s:16:\"background-media\";s:0:\"\";s:12:\"overlay-type\";s:0:\"\";s:13:\"overlay-color\";s:0:\"\";s:15:\"overlay-opacity\";s:0:\"\";s:16:\"overlay-gradient\";s:0:\"\";}}"],"footnotes":[""],"_elementor_edit_mode":["builder"],"_elementor_template_type":["wp-post"],"_elementor_data":["[{\"id\":\"733c0b06\",\"elType\":\"container\",\"settings\":{\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"7b990e0\"}]},\"elements\":[{\"id\":\"6269846d\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<p data-start=\\\"49\\\" data-end=\\\"461\\\">There are no great individuals, only great teams. With the team working together, the first-stage PCB CAM automation project for <strong data-start=\\\"178\\\" data-end=\\\"194\\\">net handling<\\\/strong> and <strong data-start=\\\"199\\\" data-end=\\\"217\\\">drill handling<\\\/strong> is done. Next, we can move on to the PCB rules engine. Here I talk about drill compensation in PCB engineering. As a PCB engineering developer, you should know what it is and why it works. I share the key points about drill compensation below.<\\\/p>\\n<hr data-start=\\\"463\\\" data-end=\\\"466\\\" \\\/>\\n<h2 data-start=\\\"468\\\" data-end=\\\"507\\\">1. Why do we compensate drill sizes?<\\\/h2>\\n<p data-start=\\\"509\\\" data-end=\\\"870\\\">The hole sizes in the PCB files the customer gives usually mean the <em data-start=\\\"577\\\" data-end=\\\"584\\\">final<\\\/em> hole size. During PCB production, copper is plated inside the holes (or the holes get a surface finish such as HASL, ENIG, OSP, etc.). This makes the hole smaller. To make sure the final hole size meets the requirement, the CAM step corrects the drill size. This is drill compensation.<\\\/p>\\n<p data-start=\\\"872\\\" data-end=\\\"1171\\\"><strong data-start=\\\"872\\\" data-end=\\\"889\\\">Real example:<\\\/strong><br data-start=\\\"889\\\" data-end=\\\"892\\\" \\\/>Final hole size: <strong data-start=\\\"909\\\" data-end=\\\"920\\\">1.00 mm<\\\/strong>. Surface finish: <strong data-start=\\\"938\\\" data-end=\\\"946\\\">ENIG<\\\/strong> (nickel thickness 2.54 \\u00b5m, gold thickness 0.0254 \\u00b5m). Follow IPC Class II and the average plated copper thickness is <strong data-start=\\\"1064\\\" data-end=\\\"1073\\\">20 \\u00b5m<\\\/strong>. If we use <strong data-start=\\\"1085\\\" data-end=\\\"1096\\\">0.10 mm<\\\/strong> as the compensation value, the CAM team will pick a <strong data-start=\\\"1149\\\" data-end=\\\"1160\\\">1.10 mm<\\\/strong> drill bit.<\\\/p>\\n<p data-start=\\\"872\\\" data-end=\\\"1171\\\"><img class=\\\"alignnone size-full wp-image-4578\\\" src=\\\"https:\\\/\\\/flj-pcb.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/Real-example.webp\\\" alt=\\\"Real example\\\" width=\\\"336\\\" height=\\\"297\\\" \\\/><\\\/p>\\n<hr data-start=\\\"1173\\\" data-end=\\\"1176\\\" \\\/>\\n<h2 data-start=\\\"1178\\\" data-end=\\\"1216\\\">2. How do we do drill compensation?<\\\/h2>\\n<p data-start=\\\"1218\\\" data-end=\\\"1445\\\">First, be clear about the three key parameters for drill compensation:<br data-start=\\\"1288\\\" data-end=\\\"1291\\\" \\\/><strong data-start=\\\"1291\\\" data-end=\\\"1298\\\">(1)<\\\/strong> Drill bit increment,<br data-start=\\\"1319\\\" data-end=\\\"1322\\\" \\\/><strong data-start=\\\"1322\\\" data-end=\\\"1329\\\">(2)<\\\/strong> Compensation value,<br data-start=\\\"1349\\\" data-end=\\\"1352\\\" \\\/><strong data-start=\\\"1352\\\" data-end=\\\"1359\\\">(3)<\\\/strong> Step-up threshold (advance value).<br data-start=\\\"1394\\\" data-end=\\\"1397\\\" \\\/>These three determine how to apply compensation.<\\\/p>\\n<h3 data-start=\\\"1447\\\" data-end=\\\"1475\\\">1) Drill bit increment<\\\/h3>\\n<p data-start=\\\"1476\\\" data-end=\\\"1773\\\">This depends on the drill bits the company buys. The industry common increment is <strong data-start=\\\"1558\\\" data-end=\\\"1567\\\">50 \\u00b5m<\\\/strong>. Typical drill sizes range from <strong data-start=\\\"1600\\\" data-end=\\\"1611\\\">0.10 mm<\\\/strong> to <strong data-start=\\\"1615\\\" data-end=\\\"1626\\\">6.35 mm<\\\/strong>. The usual smallest step between drill bits is <strong data-start=\\\"1674\\\" data-end=\\\"1685\\\">0.05 mm<\\\/strong>. So the drill library has sizes like <strong data-start=\\\"1723\\\" data-end=\\\"1761\\\">0.10 mm, 0.15 mm, 0.20 mm, 0.25 mm<\\\/strong>, and so on.<\\\/p>\\n<h3 data-start=\\\"1775\\\" data-end=\\\"1802\\\">2) Compensation value<\\\/h3>\\n<p data-start=\\\"1803\\\" data-end=\\\"1952\\\">The process team sets the compensation rules based on factory test results. Compensation values do not vary much across the industry. Common rules:<\\\/p>\\n<ul data-start=\\\"1953\\\" data-end=\\\"2098\\\">\\n<li data-start=\\\"1953\\\" data-end=\\\"2014\\\">\\n<p data-start=\\\"1955\\\" data-end=\\\"2014\\\"><strong data-start=\\\"1955\\\" data-end=\\\"1975\\\">Boards with HASL<\\\/strong> (spray tin): <strong data-start=\\\"1989\\\" data-end=\\\"2011\\\">compensate 0.15 mm<\\\/strong>.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"2015\\\" data-end=\\\"2098\\\">\\n<p data-start=\\\"2017\\\" data-end=\\\"2098\\\"><strong data-start=\\\"2017\\\" data-end=\\\"2040\\\">Boards without HASL<\\\/strong> (ENIG, immersion tin, OSP, etc.): <strong data-start=\\\"2075\\\" data-end=\\\"2097\\\">compensate 0.10 mm<\\\/strong>.<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<h3 data-start=\\\"2100\\\" data-end=\\\"2142\\\">3) Step-up threshold (advance value)<\\\/h3>\\n<p data-start=\\\"2143\\\" data-end=\\\"2403\\\">The process team also sets the strategy for picking the drill bit, similar to a rounding rule. For example, when the increment is <strong data-start=\\\"2273\\\" data-end=\\\"2282\\\">20 \\u00b5m<\\\/strong>, if the remainder after dividing by the increment is <strong data-start=\\\"2336\\\" data-end=\\\"2347\\\">\\u2265 20 \\u00b5m<\\\/strong>, you round up 50 \\u00b5m; otherwise you keep the lower size.<\\\/p>\\n<p data-start=\\\"2405\\\" data-end=\\\"2737\\\"><strong data-start=\\\"2405\\\" data-end=\\\"2417\\\">Example:<\\\/strong><br data-start=\\\"2417\\\" data-end=\\\"2420\\\" \\\/>Final hole size = <strong data-start=\\\"2438\\\" data-end=\\\"2450\\\">1.025 mm<\\\/strong>, compensation = <strong data-start=\\\"2467\\\" data-end=\\\"2478\\\">0.10 mm<\\\/strong>, so compensated size = <strong data-start=\\\"2502\\\" data-end=\\\"2514\\\">1.125 mm<\\\/strong>. But there is no <strong data-start=\\\"2532\\\" data-end=\\\"2544\\\">1.125 mm<\\\/strong> drill in the library. Use the step-up rule. The remainder of 1.125 mm when compared to the 0.05 mm step is <strong data-start=\\\"2652\\\" data-end=\\\"2661\\\">25 \\u00b5m<\\\/strong>. Since <strong data-start=\\\"2669\\\" data-end=\\\"2686\\\">25 \\u00b5m &gt; 20 \\u00b5m<\\\/strong>, round up by 50 \\u00b5m and choose a <strong data-start=\\\"2719\\\" data-end=\\\"2730\\\">1.15 mm<\\\/strong> drill.<\\\/p>\\n<hr data-start=\\\"2739\\\" data-end=\\\"2742\\\" \\\/>\\n<h3 data-start=\\\"2744\\\" data-end=\\\"2782\\\">Actual drill compensation examples<\\\/h3>\\n<p data-start=\\\"2784\\\" data-end=\\\"2850\\\">Assume: drill increment = <strong data-start=\\\"2810\\\" data-end=\\\"2819\\\">50 \\u00b5m<\\\/strong>, step-up threshold = <strong data-start=\\\"2841\\\" data-end=\\\"2850\\\">20 \\u00b5m<\\\/strong><\\\/p>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"2852\\\" data-end=\\\"3097\\\">\\n<thead data-start=\\\"2852\\\" data-end=\\\"2947\\\">\\n<tr data-start=\\\"2852\\\" data-end=\\\"2947\\\">\\n<th data-start=\\\"2852\\\" data-end=\\\"2868\\\" data-col-size=\\\"sm\\\">Original hole<\\\/th>\\n<th data-start=\\\"2868\\\" data-end=\\\"2883\\\" data-col-size=\\\"sm\\\">Compensation<\\\/th>\\n<th data-start=\\\"2883\\\" data-end=\\\"2904\\\" data-col-size=\\\"sm\\\">After compensation<\\\/th>\\n<th data-start=\\\"2904\\\" data-end=\\\"2919\\\" data-col-size=\\\"sm\\\">Integer part<\\\/th>\\n<th data-start=\\\"2919\\\" data-end=\\\"2931\\\" data-col-size=\\\"sm\\\">Remainder<\\\/th>\\n<th data-start=\\\"2931\\\" data-end=\\\"2947\\\" data-col-size=\\\"sm\\\">Drill chosen<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"2980\\\" data-end=\\\"3097\\\">\\n<tr data-start=\\\"2980\\\" data-end=\\\"3038\\\">\\n<td data-start=\\\"2980\\\" data-end=\\\"2991\\\" data-col-size=\\\"sm\\\">1.025 mm<\\\/td>\\n<td data-start=\\\"2991\\\" data-end=\\\"2998\\\" data-col-size=\\\"sm\\\">0.10<\\\/td>\\n<td data-start=\\\"2998\\\" data-end=\\\"3009\\\" data-col-size=\\\"sm\\\">1.125 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3009\\\" data-end=\\\"3016\\\">1.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3016\\\" data-end=\\\"3027\\\">0.025 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3027\\\" data-end=\\\"3038\\\">1.15 mm<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"3039\\\" data-end=\\\"3097\\\">\\n<td data-start=\\\"3039\\\" data-end=\\\"3050\\\" data-col-size=\\\"sm\\\">1.016 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3050\\\" data-end=\\\"3057\\\">0.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3057\\\" data-end=\\\"3068\\\">1.116 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3068\\\" data-end=\\\"3075\\\">1.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3075\\\" data-end=\\\"3086\\\">0.016 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"3086\\\" data-end=\\\"3097\\\">1.10 mm<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<h4 data-start=\\\"3099\\\" data-end=\\\"3140\\\">How to compute the chosen drill size<\\\/h4>\\n<p data-start=\\\"3141\\\" data-end=\\\"3241\\\">Break the compensated hole size into an integer part and a remainder part using the drill increment:<\\\/p>\\n<p data-start=\\\"3243\\\" data-end=\\\"3396\\\">Take <strong data-start=\\\"3248\\\" data-end=\\\"3260\\\">1.125 mm<\\\/strong> as an example:<br data-start=\\\"3275\\\" data-end=\\\"3278\\\" \\\/>1.125 \\\/ 0.05 = 22.5 \\u2192 floor to 22 \\u2192 integer part = 22 \\u00d7 0.05 = <strong data-start=\\\"3341\\\" data-end=\\\"3352\\\">1.10 mm<\\\/strong>.<br data-start=\\\"3353\\\" data-end=\\\"3356\\\" \\\/>Remainder = 1.125 % 0.05 = <strong data-start=\\\"3383\\\" data-end=\\\"3395\\\">0.025 mm<\\\/strong>.<\\\/p>\\n<p data-start=\\\"3398\\\" data-end=\\\"3475\\\">Then compare the remainder with the step-up threshold (for example, 20 \\u00b5m):<\\\/p>\\n<ul data-start=\\\"3476\\\" data-end=\\\"3607\\\">\\n<li data-start=\\\"3476\\\" data-end=\\\"3542\\\">\\n<p data-start=\\\"3478\\\" data-end=\\\"3542\\\">If remainder &gt; threshold, drill size = integer part + 0.05 mm.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"3543\\\" data-end=\\\"3607\\\">\\n<p data-start=\\\"3545\\\" data-end=\\\"3607\\\">If remainder \\u2264 threshold, drill size = integer part + 0.00 mm.<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<hr data-start=\\\"3609\\\" data-end=\\\"3612\\\" \\\/>\\n<h3 data-start=\\\"3614\\\" data-end=\\\"3653\\\">Summary about the step-up threshold<\\\/h3>\\n<p data-start=\\\"3654\\\" data-end=\\\"3897\\\">When the drill increment is <strong data-start=\\\"3682\\\" data-end=\\\"3691\\\">50 \\u00b5m<\\\/strong>, the step-up threshold is critical. It performs a second correction of the compensated drill size. It decides whether to \\u201cstep up\\u201d or \\u201cstay.\\u201d Changing this threshold directly changes the chosen drill size.<\\\/p>\\n<p data-start=\\\"3899\\\" data-end=\\\"3943\\\"><strong data-start=\\\"3899\\\" data-end=\\\"3943\\\">More examples (drill increment = 50 \\u00b5m):<\\\/strong><\\\/p>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"3945\\\" data-end=\\\"4209\\\">\\n<thead data-start=\\\"3945\\\" data-end=\\\"4041\\\">\\n<tr data-start=\\\"3945\\\" data-end=\\\"4041\\\">\\n<th data-start=\\\"3945\\\" data-end=\\\"3961\\\" data-col-size=\\\"sm\\\">Original hole<\\\/th>\\n<th data-start=\\\"3961\\\" data-end=\\\"3976\\\" data-col-size=\\\"sm\\\">Compensation<\\\/th>\\n<th data-start=\\\"3976\\\" data-end=\\\"3990\\\" data-col-size=\\\"sm\\\">After comp.<\\\/th>\\n<th data-start=\\\"3990\\\" data-end=\\\"4000\\\" data-col-size=\\\"sm\\\">Integer<\\\/th>\\n<th data-start=\\\"4000\\\" data-end=\\\"4012\\\" data-col-size=\\\"sm\\\">Remainder<\\\/th>\\n<th data-start=\\\"4012\\\" data-end=\\\"4032\\\" data-col-size=\\\"sm\\\">Step-up threshold<\\\/th>\\n<th data-start=\\\"4032\\\" data-end=\\\"4041\\\" data-col-size=\\\"sm\\\">Drill<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"4079\\\" data-end=\\\"4209\\\">\\n<tr data-start=\\\"4079\\\" data-end=\\\"4143\\\">\\n<td data-start=\\\"4079\\\" data-end=\\\"4090\\\" data-col-size=\\\"sm\\\">1.022 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4090\\\" data-end=\\\"4096\\\">0.1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4096\\\" data-end=\\\"4107\\\">1.122 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4107\\\" data-end=\\\"4114\\\">1.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4114\\\" data-end=\\\"4125\\\">0.022 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4125\\\" data-end=\\\"4132\\\">0.02<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4132\\\" data-end=\\\"4143\\\">1.15 mm<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"4144\\\" data-end=\\\"4209\\\">\\n<td data-start=\\\"4144\\\" data-end=\\\"4155\\\" data-col-size=\\\"sm\\\">1.022 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4155\\\" data-end=\\\"4161\\\">0.1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4161\\\" data-end=\\\"4172\\\">1.122 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4172\\\" data-end=\\\"4179\\\">1.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4179\\\" data-end=\\\"4190\\\">0.022 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4190\\\" data-end=\\\"4198\\\">0.025<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"4198\\\" data-end=\\\"4209\\\">1.10 mm<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<hr data-start=\\\"4211\\\" data-end=\\\"4214\\\" \\\/>\\n<h3 data-start=\\\"4216\\\" data-end=\\\"4266\\\">Personal view on setting the step-up threshold<\\\/h3>\\n<p data-start=\\\"4267\\\" data-end=\\\"4575\\\"><strong data-start=\\\"4267\\\" data-end=\\\"4285\\\">Pros and cons:<\\\/strong> After compensation, if the final hole is a little larger, at least the part can be inserted. If the hole is too small, the part cannot be inserted. So we usually set the step-up threshold to <strong data-start=\\\"4477\\\" data-end=\\\"4486\\\">20 \\u00b5m<\\\/strong> instead of <strong data-start=\\\"4498\\\" data-end=\\\"4507\\\">25 \\u00b5m<\\\/strong>. The exact choice should match each process and compensation value.<\\\/p>\\n<p data-start=\\\"4577\\\" data-end=\\\"4862\\\"><strong data-start=\\\"4577\\\" data-end=\\\"4614\\\">Combined with compensation value:<\\\/strong> For boards with HASL where compensation is <strong data-start=\\\"4658\\\" data-end=\\\"4669\\\">0.15 mm<\\\/strong>, you already \\u201cover-compensate\\u201d a bit and the final holes tend to be slightly large. In that case, a step-up threshold of <strong data-start=\\\"4791\\\" data-end=\\\"4800\\\">25 \\u00b5m<\\\/strong> can also work. Use the \\u201cnearest\\u201d rule when picking the drill.<\\\/p>\\n<hr data-start=\\\"4864\\\" data-end=\\\"4867\\\" \\\/>\\n<h2 data-start=\\\"4869\\\" data-end=\\\"4943\\\">3. How to ensure final hole size meets requirements after compensation?<\\\/h2>\\n<h3 data-start=\\\"4945\\\" data-end=\\\"4983\\\">Method 1: Buy special drill bits<\\\/h3>\\n<p data-start=\\\"4984\\\" data-end=\\\"5207\\\">Standard drill increment is <strong data-start=\\\"5012\\\" data-end=\\\"5021\\\">50 \\u00b5m<\\\/strong> (0.05 mm steps like 1.00, 1.05, 1.10, 1.15 mm). With a PTH tolerance of \\u00b13 mil, a 50 \\u00b5m drill set can cover the tolerance. If the tolerance is smaller than that, use special drill bits.<\\\/p>\\n<p data-start=\\\"5209\\\" data-end=\\\"5352\\\"><strong data-start=\\\"5209\\\" data-end=\\\"5222\\\">Example 1<\\\/strong> \\u2014 Compare 50 \\u00b5m vs 25 \\u00b5m increments:<br data-start=\\\"5259\\\" data-end=\\\"5262\\\" \\\/>Original hole = <strong data-start=\\\"5278\\\" data-end=\\\"5290\\\">0.922 mm<\\\/strong>, compensation = <strong data-start=\\\"5307\\\" data-end=\\\"5318\\\">0.10 mm<\\\/strong>, compensated size = <strong data-start=\\\"5339\\\" data-end=\\\"5351\\\">1.022 mm<\\\/strong>.<\\\/p>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"5354\\\" data-end=\\\"5545\\\">\\n<thead data-start=\\\"5354\\\" data-end=\\\"5422\\\">\\n<tr data-start=\\\"5354\\\" data-end=\\\"5422\\\">\\n<th data-start=\\\"5354\\\" data-end=\\\"5365\\\" data-col-size=\\\"sm\\\">Original<\\\/th>\\n<th data-start=\\\"5365\\\" data-end=\\\"5380\\\" data-col-size=\\\"sm\\\">Compensation<\\\/th>\\n<th data-start=\\\"5380\\\" data-end=\\\"5394\\\" data-col-size=\\\"sm\\\">Compensated<\\\/th>\\n<th data-start=\\\"5394\\\" data-end=\\\"5406\\\" data-col-size=\\\"sm\\\">Increment<\\\/th>\\n<th data-start=\\\"5406\\\" data-end=\\\"5422\\\" data-col-size=\\\"sm\\\">Drill chosen<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"5450\\\" data-end=\\\"5545\\\">\\n<tr data-start=\\\"5450\\\" data-end=\\\"5496\\\">\\n<td data-start=\\\"5450\\\" data-end=\\\"5458\\\" data-col-size=\\\"sm\\\">0.922<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5458\\\" data-end=\\\"5465\\\">0.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5465\\\" data-end=\\\"5473\\\">1.022<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5473\\\" data-end=\\\"5488\\\">0.05 (50 \\u00b5m)<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5488\\\" data-end=\\\"5496\\\">1.05<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"5497\\\" data-end=\\\"5545\\\">\\n<td data-start=\\\"5497\\\" data-end=\\\"5505\\\" data-col-size=\\\"sm\\\">0.922<\\\/td>\\n<td data-start=\\\"5505\\\" data-end=\\\"5512\\\" data-col-size=\\\"sm\\\">0.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5512\\\" data-end=\\\"5520\\\">1.022<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5520\\\" data-end=\\\"5536\\\">0.025 (25 \\u00b5m)<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5536\\\" data-end=\\\"5545\\\">1.025<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<p data-start=\\\"5547\\\" data-end=\\\"5689\\\">Difference: 1.050 \\u2212 1.022 = 0.028 mm; 1.025 \\u2212 1.022 = 0.003 mm. The smaller difference is better, so <strong data-start=\\\"5648\\\" data-end=\\\"5660\\\">1.025 mm<\\\/strong> (25 \\u00b5m increment) is better.<\\\/p>\\n<p data-start=\\\"5691\\\" data-end=\\\"5818\\\"><strong data-start=\\\"5691\\\" data-end=\\\"5704\\\">Example 2<\\\/strong> \\u2014 50 \\u00b5m vs special drill:<br data-start=\\\"5730\\\" data-end=\\\"5733\\\" \\\/>Original hole = <strong data-start=\\\"5749\\\" data-end=\\\"5761\\\">0.611 mm<\\\/strong>, compensation = <strong data-start=\\\"5778\\\" data-end=\\\"5789\\\">0.10 mm<\\\/strong>, compensated = <strong data-start=\\\"5805\\\" data-end=\\\"5817\\\">0.711 mm<\\\/strong>.<\\\/p>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"5820\\\" data-end=\\\"6018\\\">\\n<thead data-start=\\\"5820\\\" data-end=\\\"5895\\\">\\n<tr data-start=\\\"5820\\\" data-end=\\\"5895\\\">\\n<th data-start=\\\"5820\\\" data-end=\\\"5831\\\" data-col-size=\\\"sm\\\">Original<\\\/th>\\n<th data-start=\\\"5831\\\" data-end=\\\"5846\\\" data-col-size=\\\"sm\\\">Compensation<\\\/th>\\n<th data-start=\\\"5846\\\" data-end=\\\"5860\\\" data-col-size=\\\"sm\\\">Compensated<\\\/th>\\n<th data-start=\\\"5860\\\" data-end=\\\"5879\\\" data-col-size=\\\"sm\\\">Increment \\\/ Type<\\\/th>\\n<th data-start=\\\"5879\\\" data-end=\\\"5895\\\" data-col-size=\\\"sm\\\">Drill chosen<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"5923\\\" data-end=\\\"6018\\\">\\n<tr data-start=\\\"5923\\\" data-end=\\\"5969\\\">\\n<td data-start=\\\"5923\\\" data-end=\\\"5931\\\" data-col-size=\\\"sm\\\">0.611<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5931\\\" data-end=\\\"5938\\\">0.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5938\\\" data-end=\\\"5946\\\">0.711<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5946\\\" data-end=\\\"5961\\\">0.05 (50 \\u00b5m)<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5961\\\" data-end=\\\"5969\\\">0.70<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"5970\\\" data-end=\\\"6018\\\">\\n<td data-start=\\\"5970\\\" data-end=\\\"5978\\\" data-col-size=\\\"sm\\\">0.611<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5978\\\" data-end=\\\"5985\\\">0.10<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5985\\\" data-end=\\\"5993\\\">0.711<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"5993\\\" data-end=\\\"6009\\\">Special drill<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"6009\\\" data-end=\\\"6018\\\">0.711<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<p data-start=\\\"6020\\\" data-end=\\\"6161\\\">Difference: 0.700 \\u2212 0.711 = \\u22120.011 mm; 0.711 \\u2212 0.711 = 0.000 mm. The smaller difference is better. So the <strong data-start=\\\"6126\\\" data-end=\\\"6152\\\">0.711 mm special drill<\\\/strong> is best.<\\\/p>\\n<h3 data-start=\\\"6163\\\" data-end=\\\"6206\\\">Method 2: Improve process and equipment<\\\/h3>\\n<ul data-start=\\\"6207\\\" data-end=\\\"6752\\\">\\n<li data-start=\\\"6207\\\" data-end=\\\"6296\\\">\\n<p data-start=\\\"6209\\\" data-end=\\\"6296\\\">Add a second board plating step to reduce uneven thickness from pattern distribution.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"6297\\\" data-end=\\\"6395\\\">\\n<p data-start=\\\"6299\\\" data-end=\\\"6395\\\">Use negative photo direct-etching and plate the whole board to reduce uneven copper thickness.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"6396\\\" data-end=\\\"6538\\\">\\n<p data-start=\\\"6398\\\" data-end=\\\"6538\\\">Lower the current density (typical is 19 ASF); slightly lower current density can improve plating uniformity but will extend plating time.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"6539\\\" data-end=\\\"6752\\\">\\n<p data-start=\\\"6541\\\" data-end=\\\"6752\\\">Upgrade to a horizontal plating line. Vertical plating lines often give thicker copper at the hole edge and thinner copper at the hole center for high aspect-ratio holes. A horizontal line can reduce that issue.<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<h3 data-start=\\\"6754\\\" data-end=\\\"6790\\\">Method 3: Improve CAM strategies<\\\/h3>\\n<ul data-start=\\\"6791\\\" data-end=\\\"7885\\\">\\n<li data-start=\\\"6791\\\" data-end=\\\"7019\\\">\\n<p data-start=\\\"6793\\\" data-end=\\\"7019\\\">For holes in isolated copper areas, apply one extra increment compensation. Isolated areas have less copper, so during plating they get higher local current density and more copper thickness; extra compensation offsets that.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"7020\\\" data-end=\\\"7361\\\">\\n<p data-start=\\\"7022\\\" data-end=\\\"7361\\\">For designs with dense traces on one side and sparse on the other (for example, a power board), place the sparse side inward and the dense side outward, and use reversed panelization. During panel plating, areas near the board edge get higher current density and thicker plating. Reversed panelization helps balance plating distribution.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"7362\\\" data-end=\\\"7617\\\">\\n<p data-start=\\\"7364\\\" data-end=\\\"7617\\\">When TOP and BOTTOM copper area differ a lot, use positive\\\/negative (yin-yang) paneling. Uneven copper area causes \\u201cbell-mouth\\u201d vias; the thicker the board and the more copper, the worse the effect; yin-yang paneling helps balance copper distribution.<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"7618\\\" data-end=\\\"7885\\\">\\n<p data-start=\\\"7620\\\" data-end=\\\"7885\\\">For isolated-area holes near the board edge or slots, add copper \\u201cpick-up\\u201d areas or copper pads near the edge or slot. Isolated holes can get too much plating thickness and become too small; extra copper near them reduces local current density and balances plating.<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<hr data-start=\\\"7887\\\" data-end=\\\"7890\\\" \\\/>\\n<h2 data-start=\\\"7892\\\" data-end=\\\"7952\\\">4. How much compensation is needed and how is it derived?<\\\/h2>\\n<p data-start=\\\"7954\\\" data-end=\\\"8087\\\">Compensation values come from process tests. Below is one set of measured hole size changes after various steps (data from a report):<\\\/p>\\n<p data-start=\\\"8089\\\" data-end=\\\"8212\\\"><strong data-start=\\\"8089\\\" data-end=\\\"8106\\\">Process flow:<\\\/strong> mechanical drilling \\u2192 immersion copper \\u2192 electroplating \\u2192 pattern transfer \\u2192 etch \\u2192 AOI \\u2192 wet film \\u2192 HASL<\\\/p>\\n<p data-start=\\\"8214\\\" data-end=\\\"8239\\\"><strong data-start=\\\"8214\\\" data-end=\\\"8237\\\">Process parameters:<\\\/strong><\\\/p>\\n<ul data-start=\\\"8240\\\" data-end=\\\"8515\\\">\\n<li data-start=\\\"8240\\\" data-end=\\\"8330\\\">\\n<p data-start=\\\"8242\\\" data-end=\\\"8330\\\">Drill: drill bit size 0.95 mm, re-sharpen\\\/regrind 3 times, drill compensation 0.15 mm;<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"8331\\\" data-end=\\\"8386\\\">\\n<p data-start=\\\"8333\\\" data-end=\\\"8386\\\">Plating: copper thickness \\u2265 18 \\u00b5m, average \\u2265 20 \\u00b5m;<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"8387\\\" data-end=\\\"8456\\\">\\n<p data-start=\\\"8389\\\" data-end=\\\"8456\\\">HASL: final hole requirement 0.80 mm, tolerance \\u00b10.08 mm (3 mil);<\\\/p>\\n<\\\/li>\\n<li data-start=\\\"8457\\\" data-end=\\\"8515\\\">\\n<p data-start=\\\"8459\\\" data-end=\\\"8515\\\">Test: 10 panels, corner trimmed, board thickness 2.0 mm.<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<h3 data-start=\\\"8517\\\" data-end=\\\"8546\\\">Hole size changes by step<\\\/h3>\\n<p data-start=\\\"8548\\\" data-end=\\\"8593\\\"><strong data-start=\\\"8548\\\" data-end=\\\"8569\\\">1) After drilling<\\\/strong> \\u2014 hole sizes measured<\\\/p>\\n<ul data-start=\\\"8594\\\" data-end=\\\"8795\\\">\\n<li data-start=\\\"8594\\\" data-end=\\\"8795\\\">\\n<p data-start=\\\"8596\\\" data-end=\\\"8795\\\">Total 1920 holes tested (10 panels, 384 holes each). Sample: 200 holes (20 per panel). Hole range: <strong data-start=\\\"8695\\\" data-end=\\\"8711\\\">0.93\\u20130.94 mm<\\\/strong>, average <strong data-start=\\\"8721\\\" data-end=\\\"8733\\\">0.931 mm<\\\/strong>.<br data-start=\\\"8734\\\" data-end=\\\"8737\\\" \\\/>(Then a long list of sampled values, mostly 0.93 or 0.94.)<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<p data-start=\\\"8797\\\" data-end=\\\"8848\\\"><strong data-start=\\\"8797\\\" data-end=\\\"8846\\\">2) After patterned plating \\u2014 copper thickness<\\\/strong><\\\/p>\\n<ul data-start=\\\"8849\\\" data-end=\\\"8999\\\">\\n<li data-start=\\\"8849\\\" data-end=\\\"8999\\\">\\n<p data-start=\\\"8851\\\" data-end=\\\"8999\\\">For each panel, test 10 holes. Copper thickness range <strong data-start=\\\"8905\\\" data-end=\\\"8917\\\">18\\u201331 \\u00b5m<\\\/strong>, meeting \\u226518 \\u00b5m and average \\u226520 \\u00b5m.<br data-start=\\\"8953\\\" data-end=\\\"8956\\\" \\\/>(Then many sample copper thickness values.)<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<p data-start=\\\"9001\\\" data-end=\\\"9045\\\"><strong data-start=\\\"9001\\\" data-end=\\\"9043\\\">3) After patterned plating \\u2014 hole size<\\\/strong><\\\/p>\\n<ul data-start=\\\"9046\\\" data-end=\\\"9176\\\">\\n<li data-start=\\\"9046\\\" data-end=\\\"9176\\\">\\n<p data-start=\\\"9048\\\" data-end=\\\"9176\\\">Total 1920 holes, sample 200. Hole range: <strong data-start=\\\"9090\\\" data-end=\\\"9106\\\">0.84\\u20130.88 mm<\\\/strong>, average <strong data-start=\\\"9116\\\" data-end=\\\"9128\\\">0.858 mm<\\\/strong>.<br data-start=\\\"9129\\\" data-end=\\\"9132\\\" \\\/>(Then many sample values, mostly 0.85\\u20130.88.)<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<p data-start=\\\"9178\\\" data-end=\\\"9209\\\"><strong data-start=\\\"9178\\\" data-end=\\\"9195\\\">4) After HASL<\\\/strong> \\u2014 hole size<\\\/p>\\n<ul data-start=\\\"9210\\\" data-end=\\\"9322\\\">\\n<li data-start=\\\"9210\\\" data-end=\\\"9322\\\">\\n<p data-start=\\\"9212\\\" data-end=\\\"9322\\\">Total 1920 holes, sample 200. Hole range: <strong data-start=\\\"9254\\\" data-end=\\\"9270\\\">0.82\\u20130.86 mm<\\\/strong>, average <strong data-start=\\\"9280\\\" data-end=\\\"9292\\\">0.836 mm<\\\/strong>.<br data-start=\\\"9293\\\" data-end=\\\"9296\\\" \\\/>(Then many sample values.)<\\\/p>\\n<\\\/li>\\n<\\\/ul>\\n<p data-start=\\\"9324\\\" data-end=\\\"9340\\\"><strong data-start=\\\"9324\\\" data-end=\\\"9340\\\">Test summary<\\\/strong><\\\/p>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"9342\\\" data-end=\\\"9531\\\">\\n<thead data-start=\\\"9342\\\" data-end=\\\"9378\\\">\\n<tr data-start=\\\"9342\\\" data-end=\\\"9378\\\">\\n<th data-start=\\\"9342\\\" data-end=\\\"9349\\\" data-col-size=\\\"sm\\\">Step<\\\/th>\\n<th data-start=\\\"9349\\\" data-end=\\\"9362\\\" data-col-size=\\\"sm\\\">Hole range<\\\/th>\\n<th data-start=\\\"9362\\\" data-end=\\\"9378\\\" data-col-size=\\\"sm\\\">Average hole<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"9395\\\" data-end=\\\"9531\\\">\\n<tr data-start=\\\"9395\\\" data-end=\\\"9439\\\">\\n<td data-start=\\\"9395\\\" data-end=\\\"9412\\\" data-col-size=\\\"sm\\\">After drilling<\\\/td>\\n<td data-start=\\\"9412\\\" data-end=\\\"9427\\\" data-col-size=\\\"sm\\\">0.93\\u20130.94 mm<\\\/td>\\n<td data-start=\\\"9427\\\" data-end=\\\"9439\\\" data-col-size=\\\"sm\\\">0.931 mm<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"9440\\\" data-end=\\\"9490\\\">\\n<td data-start=\\\"9440\\\" data-end=\\\"9463\\\" data-col-size=\\\"sm\\\">After copper plating<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"9463\\\" data-end=\\\"9478\\\">0.84\\u20130.88 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"9478\\\" data-end=\\\"9490\\\">0.858 mm<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"9491\\\" data-end=\\\"9531\\\">\\n<td data-start=\\\"9491\\\" data-end=\\\"9504\\\" data-col-size=\\\"sm\\\">After HASL<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"9504\\\" data-end=\\\"9519\\\">0.82\\u20130.86 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"9519\\\" data-end=\\\"9531\\\">0.836 mm<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<p data-start=\\\"9533\\\" data-end=\\\"9723\\\"><strong data-start=\\\"9533\\\" data-end=\\\"9548\\\">Conclusion:<\\\/strong> For HASL boards the drill compensation of <strong data-start=\\\"9591\\\" data-end=\\\"9602\\\">0.15 mm<\\\/strong> is an \\u201cover-compensation\\u201d and causes final holes to be larger. The best compensation value in this test is <strong data-start=\\\"9710\\\" data-end=\\\"9722\\\">0.125 mm<\\\/strong>.<\\\/p>\\n<hr data-start=\\\"9725\\\" data-end=\\\"9728\\\" \\\/>\\n<h2>5. Drill compensation code implementation (rules)<\\\/h2>\\n<ol data-start=\\\"9784\\\" data-end=\\\"9817\\\">\\n<li data-start=\\\"9784\\\" data-end=\\\"9817\\\">\\n<p data-start=\\\"9787\\\" data-end=\\\"9817\\\">Compensation and step-up rules<\\\/p>\\n<\\\/li>\\n<\\\/ol>\\n<div class=\\\"TyagGW_tableContainer\\\">\\n<div class=\\\"group TyagGW_tableWrapper flex w-fit flex-col-reverse\\\" tabindex=\\\"-1\\\">\\n<table class=\\\"w-fit min-w-(--thread-content-width)\\\" data-start=\\\"9819\\\" data-end=\\\"10843\\\">\\n<thead data-start=\\\"9819\\\" data-end=\\\"9968\\\">\\n<tr data-start=\\\"9819\\\" data-end=\\\"9968\\\">\\n<th data-start=\\\"9819\\\" data-end=\\\"9828\\\" data-col-size=\\\"sm\\\">Aspect<\\\/th>\\n<th data-start=\\\"9828\\\" data-end=\\\"9844\\\" data-col-size=\\\"sm\\\">Finished hole<\\\/th>\\n<th data-start=\\\"9844\\\" data-end=\\\"9861\\\" data-col-size=\\\"sm\\\">Surface finish<\\\/th>\\n<th data-start=\\\"9861\\\" data-end=\\\"9879\\\" data-col-size=\\\"sm\\\">Board thickness<\\\/th>\\n<th data-start=\\\"9879\\\" data-end=\\\"9899\\\" data-col-size=\\\"sm\\\">Step-up threshold<\\\/th>\\n<th data-start=\\\"9899\\\" data-end=\\\"9923\\\" data-col-size=\\\"sm\\\">If via copper &lt; 26 \\u00b5m<\\\/th>\\n<th data-start=\\\"9923\\\" data-end=\\\"9934\\\" data-col-size=\\\"sm\\\">26\\u201337 \\u00b5m<\\\/th>\\n<th data-start=\\\"9934\\\" data-end=\\\"9945\\\" data-col-size=\\\"sm\\\">37\\u201347 \\u00b5m<\\\/th>\\n<th data-start=\\\"9945\\\" data-end=\\\"9956\\\" data-col-size=\\\"sm\\\">47\\u201367 \\u00b5m<\\\/th>\\n<th data-start=\\\"9956\\\" data-end=\\\"9968\\\" data-col-size=\\\"sm\\\">67\\u201386 \\u00b5m<\\\/th>\\n<\\\/tr>\\n<\\\/thead>\\n<tbody data-start=\\\"10018\\\" data-end=\\\"10843\\\">\\n<tr data-start=\\\"10018\\\" data-end=\\\"10146\\\">\\n<td data-start=\\\"10018\\\" data-end=\\\"10043\\\" data-col-size=\\\"sm\\\">thickness ratio &lt; 12:1<\\\/td>\\n<td data-start=\\\"10043\\\" data-end=\\\"10055\\\" data-col-size=\\\"sm\\\">\\u2264 1.90 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10055\\\" data-end=\\\"10084\\\">HASL (leaded or lead-free)<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10084\\\" data-end=\\\"10095\\\">\\u2265 3.5 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10095\\\" data-end=\\\"10105\\\">0.01952<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10105\\\" data-end=\\\"10113\\\">5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10113\\\" data-end=\\\"10121\\\">6 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10121\\\" data-end=\\\"10129\\\">7 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10129\\\" data-end=\\\"10137\\\">8 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10137\\\" data-end=\\\"10146\\\">9 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10147\\\" data-end=\\\"10285\\\">\\n<td data-start=\\\"10147\\\" data-end=\\\"10172\\\" data-col-size=\\\"sm\\\">thickness ratio &lt; 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10172\\\" data-end=\\\"10184\\\">\\u2264 1.90 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10184\\\" data-end=\\\"10213\\\">HASL (leaded or lead-free)<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10213\\\" data-end=\\\"10224\\\">&lt; 3.5 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10224\\\" data-end=\\\"10234\\\">0.01952<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10234\\\" data-end=\\\"10244\\\">4.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10244\\\" data-end=\\\"10254\\\">5.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10254\\\" data-end=\\\"10264\\\">6.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10264\\\" data-end=\\\"10274\\\">7.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10274\\\" data-end=\\\"10285\\\">8.5 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10286\\\" data-end=\\\"10395\\\">\\n<td data-start=\\\"10286\\\" data-end=\\\"10311\\\" data-col-size=\\\"sm\\\">thickness ratio &lt; 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10311\\\" data-end=\\\"10323\\\">\\u2264 1.90 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10323\\\" data-end=\\\"10340\\\">Other finishes<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10340\\\" data-end=\\\"10344\\\">\\\/<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10344\\\" data-end=\\\"10354\\\">0.01952<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10354\\\" data-end=\\\"10362\\\">4 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10362\\\" data-end=\\\"10370\\\">5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10370\\\" data-end=\\\"10378\\\">6 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10378\\\" data-end=\\\"10386\\\">7 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10386\\\" data-end=\\\"10395\\\">8 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10396\\\" data-end=\\\"10504\\\">\\n<td data-start=\\\"10396\\\" data-end=\\\"10421\\\" data-col-size=\\\"sm\\\">thickness ratio &lt; 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10421\\\" data-end=\\\"10433\\\">&gt; 1.90 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10433\\\" data-end=\\\"10440\\\">HASL<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10440\\\" data-end=\\\"10444\\\">\\\/<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10444\\\" data-end=\\\"10453\\\">0.0246<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10453\\\" data-end=\\\"10463\\\">5.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10463\\\" data-end=\\\"10473\\\">6.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10473\\\" data-end=\\\"10483\\\">7.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10483\\\" data-end=\\\"10493\\\">8.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10493\\\" data-end=\\\"10504\\\">9.5 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10505\\\" data-end=\\\"10624\\\">\\n<td data-start=\\\"10505\\\" data-end=\\\"10530\\\" data-col-size=\\\"sm\\\">thickness ratio &lt; 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10530\\\" data-end=\\\"10542\\\">&gt; 1.90 mm<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10542\\\" data-end=\\\"10559\\\">Other finishes<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10559\\\" data-end=\\\"10563\\\">\\\/<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10563\\\" data-end=\\\"10573\\\">0.01952<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10573\\\" data-end=\\\"10583\\\">4.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10583\\\" data-end=\\\"10593\\\">5.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10593\\\" data-end=\\\"10603\\\">6.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10603\\\" data-end=\\\"10613\\\">7.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10613\\\" data-end=\\\"10624\\\">8.5 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10625\\\" data-end=\\\"10733\\\">\\n<td data-start=\\\"10625\\\" data-end=\\\"10650\\\" data-col-size=\\\"sm\\\">thickness ratio \\u2265 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10650\\\" data-end=\\\"10662\\\">all holes<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10662\\\" data-end=\\\"10669\\\">HASL<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10669\\\" data-end=\\\"10673\\\">\\\/<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10673\\\" data-end=\\\"10682\\\">0.0246<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10682\\\" data-end=\\\"10692\\\">5.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10692\\\" data-end=\\\"10702\\\">6.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10702\\\" data-end=\\\"10712\\\">7.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10712\\\" data-end=\\\"10722\\\">8.5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10722\\\" data-end=\\\"10733\\\">9.5 mil<\\\/td>\\n<\\\/tr>\\n<tr data-start=\\\"10734\\\" data-end=\\\"10843\\\">\\n<td data-start=\\\"10734\\\" data-end=\\\"10759\\\" data-col-size=\\\"sm\\\">thickness ratio \\u2265 12:1<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10759\\\" data-end=\\\"10771\\\">all holes<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10771\\\" data-end=\\\"10788\\\">Other finishes<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10788\\\" data-end=\\\"10792\\\">\\\/<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10792\\\" data-end=\\\"10802\\\">0.01952<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10802\\\" data-end=\\\"10810\\\">5 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10810\\\" data-end=\\\"10818\\\">6 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10818\\\" data-end=\\\"10826\\\">7 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10826\\\" data-end=\\\"10834\\\">8 mil<\\\/td>\\n<td data-col-size=\\\"sm\\\" data-start=\\\"10834\\\" data-end=\\\"10843\\\">9 mil<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/div>\\n<\\\/div>\\n<ol start=\\\"2\\\" data-start=\\\"10845\\\" data-end=\\\"10953\\\">\\n<li data-start=\\\"10845\\\" data-end=\\\"10953\\\">\\n<p data-start=\\\"10848\\\" data-end=\\\"10953\\\">Special drill sizes (if tolerance &lt; 3 mil, use special drills or 25 \\u00b5m increment, use nearest drill rule)<\\\/p>\\n<\\\/li>\\n<\\\/ol>\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"a4fd860\"}]},\"elements\":[],\"widgetType\":\"text-editor\"},{\"id\":\"f7e142f\",\"elType\":\"widget\",\"settings\":{\"language\":\"aspnet\",\"code\":\"List<double> ContainDrillToolList = new List<double>();\\r\\nContainDrillToolList.AddRange(new double[] { 610, 635, 711, 838, 914, 1016, 1320, 3120 });\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"e63c3e6\"}]},\"elements\":[],\"widgetType\":\"code-highlight\"},{\"id\":\"ec5424b\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<p>3. Drill Compensation Code<\\\/p>\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"17c7393\"}]},\"elements\":[],\"widgetType\":\"text-editor\"},{\"id\":\"3dfeb51\",\"elType\":\"widget\",\"settings\":{\"language\":\"csharp\",\"code\":\"\\\/\\\/\\\/<summary>\\r\\n\\\/\\\/\\\/ Calculate the drill bit diameter based on drill compensation parameters\\r\\n\\\/\\\/\\\/<\\\/summary>\\r\\n\\\/\\\/\\\/<param name=\\\"ToolInfo\\\">Drill tool basic information<\\\/param>\\r\\n\\\/\\\/\\\/<param name=\\\"UpParam\\\">Drill compensation parameters<\\\/param>\\r\\n\\\/\\\/\\\/<param name=\\\"ContainDrillToolList\\\">Special drill bit diameter list<\\\/param>\\r\\n\\\/\\\/\\\/<returns>Return 1 if calculation is successful<\\\/returns>\\r\\npublic static int getDrillUpSize(Mod_tool ToolInfo, gToolUpParam UpParam, List<double> ContainDrillToolList)\\r\\n{\\r\\n    if (ContainDrillToolList == null) ContainDrillToolList = new List<double>();\\r\\n    gToolUpParamHole UpParamHole = new G_Helper.gToolUpParamHole();\\r\\n    switch (ToolInfo.type)\\r\\n    {\\r\\n        case \\\"via\\\":\\r\\n            UpParamHole = UpParam.Via;\\r\\n            break;\\r\\n        case \\\"plate\\\":\\r\\n            UpParamHole = UpParam.Pth;\\r\\n            break;\\r\\n        case \\\"nplate\\\":\\r\\n            UpParamHole = UpParam.Npth;\\r\\n            break;\\r\\n    }\\r\\n    ToolInfo.max_tol = Math.Round(UpParamHole.Max_Tol, 0);\\r\\n    ToolInfo.min_tol = Math.Round(UpParamHole.Min_Tol, 0);\\r\\n    if (ToolInfo.finish_size < 50)\\r\\n    {\\r\\n        ToolInfo.finish_size = ToolInfo.drill_size;\\r\\n    }\\r\\n    double DrillSlotLevel = (ToolInfo.shape == \\\"slot\\\") ? UpParam.SlotLevel : UpParam.DrillLevel;  \\\/\\\/Drill step interval: Round holes have two levels (25\\\/50\\u03bcm), slot holes have one level (50\\u03bcm)\\r\\n    double UpLevel;\\r\\n    if (UpParam.DrillLevel > 49) \\\/\\\/When the step interval is 50\\u03bcm, do not use special drill bits\\r\\n    {\\r\\n        ContainDrillToolList = new List<double>();\\r\\n        UpLevel = UpParamHole.UpLevel;\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        UpLevel = UpParam.DrillLevel * 0.5;   \\\/\\\/Select drill bit by half of the step interval\\r\\n    }\\r\\n\\r\\n    double Drillfinish_size = ToolInfo.finish_size + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \\\/\\\/Average the upper and lower tolerance\\r\\n    int DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal) \\\/ DrillSlotLevel)); \\\/\\\/Drill step count\\r\\n    double DrillsizeInt = DrillLevelCount * DrillSlotLevel; \\\/\\\/Round down to the nearest drill step\\r\\n    double DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal) % DrillSlotLevel;\\\/\\\/Remainder of drill size after step division\\r\\n    double DrillsizeLevel = (DrillsizeFloat > UpLevel) ? DrillSlotLevel : 0;\\\/\\\/Determine whether to round up the remainder\\r\\n\\r\\n    \\\/\\\/Check if special drill bits are included\\r\\n    int ContainDrillIndex = ContainDrillToolList.FindIndex(tt => (int)(Math.Floor(tt \\\/ DrillSlotLevel)) == DrillLevelCount);\\r\\n    if (ContainDrillIndex > -1)\\r\\n    {\\r\\n        double ContainDrillFloat = ContainDrillToolList[ContainDrillIndex] % DrillSlotLevel;\\\/\\\/Remainder of special drill bit size after step division\\r\\n        if (DrillsizeFloat > UpLevel) \\\/\\\/ e.g. 38 > 20\\r\\n        {\\r\\n            double diff1 = Math.Abs(DrillsizeFloat - DrillSlotLevel);   \\\/\\\/e.g. 40-50\\r\\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \\\/\\\/e.g. 40-38\\r\\n            DrillsizeLevel = (diff1 < diff2) ? DrillSlotLevel : ContainDrillFloat;\\r\\n        }\\r\\n        else \\\/\\\/if (ContainDrillFloat < UpLevel)\\r\\n        {\\r\\n            double diff1 = Math.Abs(DrillsizeFloat - 0);  \\\/\\\/e.g. 12-0\\r\\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \\\/\\\/e.g. 12-16\\r\\n            DrillsizeLevel = (diff1 < diff2) ? 0 : ContainDrillFloat;\\r\\n        }\\r\\n    }\\r\\n    ToolInfo.drill_size = DrillsizeInt + DrillsizeLevel;\\r\\n\\r\\n    double DiffDrillSizeUp = ToolInfo.drill_size - ToolInfo.finish_size;\\r\\n    if (ToolInfo.shape == \\\"slot\\\") \\\/\\\/ Slot length compensation\\r\\n    {\\r\\n        if (UpParam.isSlotUpLevel) \\\/\\\/Whether to round the slot length to step interval\\r\\n        {\\r\\n            Drillfinish_size = ToolInfo.slot_len + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \\\/\\\/Average the upper and lower tolerance\\r\\n            DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) \\\/ DrillSlotLevel)); \\\/\\\/ Drill step count\\r\\n            DrillsizeInt = DrillLevelCount * DrillSlotLevel; \\\/\\\/Round down to the nearest drill step (50\\u03bcm)\\r\\n            DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) % DrillSlotLevel;\\\/\\\/Remainder of slot length after step division\\r\\n            DrillsizeLevel = (DrillsizeFloat > UpParamHole.UpLevel) ? DrillSlotLevel : 0;\\\/\\\/Determine whether to round up the remainder\\r\\n            ToolInfo.slot_len = DrillsizeInt + DrillsizeLevel;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            DrillsizeInt = Math.Floor((ToolInfo.slot_len + DiffDrillSizeUp) \\\/ 10) * 10; \\\/\\\/ Round down to the nearest 10\\u03bcm\\r\\n            ToolInfo.slot_len = DrillsizeInt;\\r\\n        }\\r\\n        ToolInfo.drill_size += UpParam.SlotEndNumber;  \\\/\\\/ Add suffix number for slot drill bit segmentation\\r\\n    }\\r\\n    ToolInfo.bit = Math.Round((ToolInfo.drill_size * 0.001), 3).ToString();\\r\\n    return 1;\\r\\n}\\r\\n\\r\\npublic class gToolUpParam\\r\\n{\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for VIA holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Via { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for PTH (Plated Through Hole) (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Pth { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for NPTH (Non-Plated Through Hole) (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Npth { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval for round drill holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double DrillLevel { get; set; } = 50;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval for slot drill holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double SlotLevel { get; set; } = 50;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Suffix number for slot drill bit segmentation\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public int SlotEndNumber { get; set; } = 0;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Additional compensation value for slot length (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double SlotLengthUp { get; set; } = 0;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Whether to round the slot length to step interval\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public bool isSlotUpLevel { get; set; } = false;\\r\\n}\\r\\n\\r\\npublic class gToolUpParamHole\\r\\n{\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation value (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double UpVal { get; set; } = 100;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval threshold for rounding up (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double UpLevel { get; set; } = 25;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Upper tolerance (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double Max_Tol { get; set; } = 76;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Lower tolerance (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double Min_Tol { get; set; } = 76;\\r\\n}\\r\\n\\r\\n\\\/\\\/\\\/<summary>\\r\\n\\\/\\\/\\\/ Mod_tool: Drill tool attribute model\\r\\n\\\/\\\/\\\/<\\\/summary>\\r\\npublic class Mod_tool\\r\\n{\\r\\n    public int num { get; set; }\\r\\n    public string type { get; set; } \\\/\\\/ Hole type: via\\\/plate(nplate)\\r\\n    public string shape { get; set; } \\\/\\\/ Hole shape: round\\\/slot\\r\\n    public double finish_size { get; set; } \\\/\\\/ Finished hole size (in \\u03bcm)\\r\\n    public double drill_size { get; set; } \\\/\\\/ Drill bit size (in \\u03bcm)\\r\\n    public double max_tol { get; set; } \\\/\\\/ Upper tolerance (in \\u03bcm)\\r\\n    public double min_tol { get; set; } \\\/\\\/ Lower tolerance (in \\u03bcm)\\r\\n    public double slot_len { get; set; } \\\/\\\/ Slot length (in \\u03bcm)\\r\\n    public string bit { get; set; } \\\/\\\/ Drill bit size (in mm, formatted string)\\r\\n}\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"771dd1c\"}]},\"elements\":[],\"widgetType\":\"code-highlight\"},{\"id\":\"578eb26\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<h2 data-start=\\\"10960\\\" data-end=\\\"11017\\\">6. Why does board thickness affect drill compensation?<\\\/h2>\\n<p data-start=\\\"11019\\\" data-end=\\\"11464\\\">I did not understand this at first either. The main reason is the high <strong data-start=\\\"11090\\\" data-end=\\\"11121\\\">thickness-to-diameter ratio<\\\/strong> (board thickness divided by hole diameter). A high ratio makes the copper at the hole center thinner and the copper at the hole edge thicker. To compute the thickness-to-diameter ratio you need the board thickness value. So board thickness enters the drill compensation rules. For high thickness-to-diameter holes, the compensation is larger.<\\\/p>\",\"display_condition_list\":[{\"display_condition_login_status\":\"subscriber\",\"_id\":\"715c69a\"}]},\"elements\":[],\"widgetType\":\"text-editor\"}],\"isInner\":false}]"],"_elementor_conditions":["a:0:{}"],"_edit_last":["1"],"_wp_page_template":["default"],"_elementor_version":["3.33.4"],"_elementor_pro_version":["3.31.2"],"_elementor_page_settings":["a:0:{}"],"rank_math_og_content_image":["a:2:{s:5:\"check\";s:32:\"ecdd2e25359dae372358174e8b65526d\";s:6:\"images\";a:1:{i:0;i:4578;}}"],"rank_math_primary_category":["1"],"site-post-title":[""],"_thumbnail_id":["4584"],"_uag_page_assets":["a:9:{s:3:\"css\";s:30185:\".uag-blocks-common-selector{z-index:var(--z-index-desktop) !important}@media (max-width: 976px){.uag-blocks-common-selector{z-index:var(--z-index-tablet) !important}}@media (max-width: 767px){.uag-blocks-common-selector{z-index:var(--z-index-mobile) !important}}\n.uagb-social-share__outer-wrap,.uagb-social-share__wrap{display:flex;align-items:center;justify-content:center}.uagb-social-share__layout-vertical.uagb-social-share__outer-wrap,.uagb-social-share__layout-vertical .uagb-social-share__wrap{flex-direction:column}.uagb-social-share__layout-vertical .wp-block-uagb-social-share-child.uagb-ss-repeater.uagb-ss__wrapper:first-child{margin-top:0 !important}.uagb-social-share__layout-vertical .wp-block-uagb-social-share-child.uagb-ss-repeater.uagb-ss__wrapper:last-child{margin-bottom:0 !important}.uagb-social-share__outer-wrap a.uagb-button__link:focus{box-shadow:none}.uagb-social-share__outer-wrap .uagb-ss__wrapper{padding:0;margin-left:5px;margin-right:5px;transition:all 0.2s;display:inline-flex;text-align:center}.uagb-social-share__outer-wrap .uagb-ss__source-wrap{display:inline-block}.uagb-social-share__outer-wrap .uagb-ss__link{color:#3a3a3a;display:inline-table;line-height:0;cursor:pointer}.uagb-social-share__outer-wrap .uagb-ss__source-icon{font-size:40px;width:40px;height:40px}.uagb-social-share__outer-wrap .uagb-ss__source-image{width:40px}@media (max-width: 976px){.uagb-social-share__layout-horizontal .uagb-ss__wrapper{margin-left:0;margin-right:0}}.uagb-social-share__layout-horizontal .wp-block-uagb-social-share-child.uagb-ss-repeater.uagb-ss__wrapper:first-child{margin-left:0 !important}.uagb-social-share__layout-horizontal .wp-block-uagb-social-share-child.uagb-ss-repeater.uagb-ss__wrapper:last-child{margin-right:0 !important}\n.wp-block-uagb-social-share .uagb-social-share__wrapper{text-decoration:none}.uagb-social-share__wrapper{box-shadow:none}.uagb-social-share__outer-wrap:not(.uagb-social-share__no-label) .uagb-social-share__source-wrap{margin-right:15px}.uagb-social-share__outer-wrap.uagb-social-share__icon-at-top .uagb-social-share__source-wrap{-ms-flex-item-align:flex-start;align-self:flex-start;margin-top:5px}\n.uagb-block-015f0124 .uagb-ss-repeater span.uagb-ss__link{color: #3a3a3a;}.uagb-block-015f0124 .uagb-ss-repeater a.uagb-ss__link{color: #3a3a3a;}.uagb-block-015f0124 .uagb-ss-repeater span.uagb-ss__link svg{fill: #3a3a3a;}.uagb-block-015f0124 .uagb-ss-repeater a.uagb-ss__link svg{fill: #3a3a3a;}.uagb-block-015f0124.uagb-social-share__layout-vertical .uagb-ss__wrapper{margin-left: 0;margin-right: 0;margin-top: 5px;margin-bottom: 5px;}.uagb-block-015f0124.uagb-social-share__layout-vertical .uagb-ss__link{padding: 10px;}.uagb-block-015f0124.uagb-social-share__layout-horizontal .uagb-ss__link{padding: 10px;}.uagb-block-015f0124.uagb-social-share__layout-horizontal .uagb-ss__wrapper{margin-left: 5px;margin-right: 5px;}.uagb-block-015f0124 .wp-block-uagb-social-share-child {border-radius: 0px;}.uagb-block-015f0124 .uagb-ss__source-wrap{width: 30px;}.uagb-block-015f0124 .uagb-ss__source-wrap svg{width: 30px;height: 30px;}.uagb-block-015f0124 .uagb-ss__source-image{width: 30px;}.uagb-block-015f0124 .uagb-ss__source-icon{width: 30px;height: 30px;font-size: 30px;}.uagb-block-015f0124.uagb-social-share__outer-wrap{justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: center;-ms-flex-align: center;align-items: center;}.uagb-block-44317091.uagb-ss-repeater span.uagb-ss__link{color: #3b5998;}.uagb-block-44317091.uagb-ss-repeater a.uagb-ss__link{color: #3b5998;}.uagb-block-44317091.uagb-ss-repeater span.uagb-ss__link svg{fill: #3b5998;}.uagb-block-44317091.uagb-ss-repeater a.uagb-ss__link svg{fill: #3b5998;}.uagb-block-df693e43.uagb-ss-repeater span.uagb-ss__link{color: #55acee;}.uagb-block-df693e43.uagb-ss-repeater a.uagb-ss__link{color: #55acee;}.uagb-block-df693e43.uagb-ss-repeater span.uagb-ss__link svg{fill: #55acee;}.uagb-block-df693e43.uagb-ss-repeater a.uagb-ss__link svg{fill: #55acee;}.uagb-block-e0123642.uagb-ss-repeater span.uagb-ss__link{color: #bd081c;}.uagb-block-e0123642.uagb-ss-repeater a.uagb-ss__link{color: #bd081c;}.uagb-block-e0123642.uagb-ss-repeater span.uagb-ss__link svg{fill: #bd081c;}.uagb-block-e0123642.uagb-ss-repeater a.uagb-ss__link svg{fill: #bd081c;}.uagb-block-23521e42.uagb-ss-repeater span.uagb-ss__link{color: #0077b5;}.uagb-block-23521e42.uagb-ss-repeater a.uagb-ss__link{color: #0077b5;}.uagb-block-23521e42.uagb-ss-repeater span.uagb-ss__link svg{fill: #0077b5;}.uagb-block-23521e42.uagb-ss-repeater a.uagb-ss__link svg{fill: #0077b5;}@media only screen and (max-width: 976px) {.uagb-block-015f0124.uagb-social-share__layout-vertical .uagb-ss__wrapper{margin-left: 0;margin-right: 0;margin-top: 5px;margin-bottom: 5px;}.uagb-block-015f0124.uagb-social-share__layout-horizontal .uagb-ss__wrapper{margin-left: 5px;margin-right: 5px;}.uagb-block-015f0124.uagb-social-share__outer-wrap{justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: center;-ms-flex-align: center;align-items: center;}}@media only screen and (max-width: 767px) {.uagb-block-015f0124.uagb-social-share__layout-vertical .uagb-ss__wrapper{margin-left: 0;margin-right: 0;margin-top: 5px;margin-bottom: 5px;}.uagb-block-015f0124.uagb-social-share__layout-horizontal .uagb-ss__wrapper{margin-left: 5px;margin-right: 5px;}.uagb-block-015f0124.uagb-social-share__outer-wrap{justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: center;-ms-flex-align: center;align-items: center;}}.uagb-cta__outer-wrap .uagb-cta__content,.uagb-cta__outer-wrap a.uagb-cta__block-link span,.uagb-cta__outer-wrap .uagb-cta__content-right .uagb-cta__button-wrapper,.uagb-cta__outer-wrap .uagb-cta-typeof-button,.uagb-cta__outer-wrap .uagb-cta__content-right .uagb-cta__block-link,.uagb-cta__outer-wrap .uagb-cta-with-svg{display:inline-block}.uagb-cta__outer-wrap{display:flex;justify-content:space-between}.wp-block-uagb-call-to-action .uagb-cta__buttons{display:inline-flex}.wp-block-uagb-call-to-action .wp-block-button__link,.wp-block-uagb-call-to-action .ast-outline-button{fill:currentColor;justify-content:center}.uagb-cta__button-link-wrapper,.uagb-cta-second__button{display:inline-flex;align-items:center;word-break:keep-all;width:100%}.uagb-cta__title{padding:0;margin:0;display:block}.uagb-cta__content-right .uagb-cta__button-wrapper{float:right}.uagb-cta__link-wrapper.uagb-cta__block-link-style:empty{display:none}a.uagb-cta__block-link,.entry .entry-content a.uagb-cta__block-link,a.uagb-cta__block-link-wrap,.entry .entry-content a.uagb-cta__block-link-wrap{text-decoration:none}a.uagb-cta__block-link:hover,.entry .entry-content a.uagb-cta__block-link:hover,a.uagb-cta__block-link-wrap:hover,.entry .entry-content a.uagb-cta__block-link-wrap:hover .entry .entry-content a.uagb-cta__block-link:hover{color:inherit}.uagb-cta__content-right{text-align:right;justify-content:flex-end}.uagb-cta__left-right-wrap{width:100%;word-break:break-word}.uagb-cta__icon-position-below-title .uagb-cta__left-right-wrap{display:block;min-width:100%;width:100%}.uagb-cta__icon-position-left .uagb-cta__left-right-wrap,.uagb-cta__icon-position-right .uagb-cta__left-right-wrap{display:flex}.uagb-cta__icon-position-right .uagb-cta__left-right-wrap{justify-content:flex-end}.uagb-cta__block-link-icon-after{margin-left:5px;margin-right:0}.uagb-cta__block-link-icon-before{margin-left:0;margin-right:5px}.uagb-cta__block-link-icon,.uagb-cta__block svg{transition:all 200ms linear}.uagb-cta__block{position:relative}.uagb-cta-typeof-button{line-height:1;text-align:center}.uagb-cta__content-right .uagb-cta__button-link-wrapper,.uagb-cta__content-right .uagb-cta-second__button .uagb-cta__content-right .uagb-cta__block-link,.uagb-cta__content-right.uagb-cta__button-valign-middle .uagb-cta__left-right-wrap{display:flex;align-items:center}.uagb-cta__content-right .uagb-cta__button-link-wrapper,.uagb-cta__content-right .uagb-cta-second__button .uagb-cta__content-right .uagb-cta__block-link{justify-content:center}.uagb-cta__link-wrapper a{box-shadow:none;text-decoration:none}.uagb-cta__block,.uagb-cta__content,.uagb-cta__left-right-wrap{z-index:1}.uagb-cta__block-link{cursor:pointer}.uagb-cta__content-right .uagb-cta__block-link{float:right;padding:10px 14px}a.uagb-cta__block-link-wrap{color:inherit}.uagb-cta__content p:empty{display:none}.uagb-cta__button-type-none .uagb-cta__content{width:100%}.uagb-cta-with-svg{height:14px;width:14px;line-height:14px;vertical-align:middle}.uagb-cta__block svg{display:block;height:inherit;width:inherit}.uagb-cta__button-link-wrapper svg{width:20px;height:20px}.uagb-cta__align-button-after{margin-left:5px}.uagb-cta__align-button-before{margin-right:5px}.uagb-cta__block-link i{font-style:normal}a.uagb-cta__link-to-all{position:absolute;top:0;left:0;width:100%;height:100%;z-index:11}.wp-block-uagb-call-to-action{position:relative}.wp-block-uagb-call-to-action a.uagb-cta__link-to-all{position:absolute;top:0;left:0;width:100%;height:100%;z-index:11}@media only screen and (max-width: 976px){.uagb-cta__content-stacked-tablet,.uagb-cta__content-stacked-tablet .uagb-cta__left-right-wrap{flex-direction:column;text-align:center}.uagb-cta__content-stacked-tablet.uagb-cta__content-right .uagb-cta__button-wrapper{float:none;margin:0 auto}.uagb-cta__content-stacked-tablet .uagb-cta__left-right-wrap .uagb-cta__content{margin-left:0;margin-right:0}.uagb-cta__content-stacked-tablet.uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__content,.uagb-cta__content-stacked-tablet.uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__link-wrapper{width:100% !important}}@media screen and (max-width: 767px){.uagb-cta__content-stacked-mobile,.uagb-cta__content-stacked-mobile .uagb-cta__left-right-wrap{flex-direction:column;text-align:center}.uagb-cta__content-stacked-mobile.uagb-cta__content-right .uagb-cta__button-wrapper{float:none;margin:0 auto}.uagb-cta__content-stacked-mobile .uagb-cta__left-right-wrap .uagb-cta__content{margin-left:0;margin-right:0}.uagb-cta__content-stacked-mobile.uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__content,.uagb-cta__content-stacked-mobile.uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__link-wrapper{width:100% !important}}.uagb-cta__desc p:last-child{margin-bottom:0}\n#uagb-cta-block-.wp-block-uagb-call-to-action .uagb-cta__title{margin-bottom: 10px;}#uagb-cta-block-.wp-block-uagb-call-to-action .uagb-cta__desc{margin-bottom: 10px;}#uagb-cta-block- .uagb-cta__align-button-after{margin-left: 10px;}#uagb-cta-block- .uagb-cta__align-button-before{margin-right: 10px;}#uagb-cta-block-.wp-block-uagb-call-to-action a.uagb-cta__button-link-wrapper > svg{margin-left: 10px;}#uagb-cta-block-.wp-block-uagb-call-to-action a.uagb-cta-second__button > svg{margin-left: 10px;font-size: 14px;width: 14px;height: 14px;line-height: 14px;}#uagb-cta-block- .uagb-cta__content-wrap{text-align: left;}#uagb-cta-block- .uagb-cta__wrap{width: 70%;text-align: left;}#uagb-cta-block-.wp-block-uagb-call-to-action{text-align: left;}#uagb-cta-block- .uagb-cta__left-right-wrap .uagb-cta__content{margin-left: 0px;}#uagb-cta-block- .uagb-cta__buttons{column-gap: 15px;}#uagb-cta-block-.wp-block-uagb-call-to-action {display: flex;justify-content: space-between;}#uagb-cta-block- .uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__content{width: 70%;}#uagb-cta-block- .uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__link-wrapper{width: 30%;}#uagb-cta-block-.wp-block-uagb-call-to-action a.uagb-cta__button-link-wrapper {align-self: center;height: fit-content;margin-left: auto;}#uagb-cta-block-.wp-block-uagb-call-to-action  {flex-direction: row;align-items: center;}#uagb-cta-block-.wp-block-uagb-call-to-action.wp-block-button a.uagb-cta-second__button{align-self: center;height: fit-content;}#uagb-cta-block-.wp-block-uagb-call-to-action.wp-block-button a.uagb-cta-second__button:hover{background-color: !important;}#uagb-cta-block-.wp-block-uagb-call-to-action.wp-block-button a.uagb-cta-second__button:focus{background-color: !important;}#uagb-cta-block- .uagb-cta__button-wrapper a.uagb-cta-typeof-button{color: #333;border-style: solid;}#uagb-cta-block-.wp-block-uagb-call-to-action.wp-block-button .uagb-cta__buttons a.uagb-cta__button-link-wrapper.wp-block-button__link{border-style: solid;}#uagb-cta-block-.wp-block-uagb-call-to-action a.uagb-cta-second__button{text-transform: normal;text-decoration: none;font-size: 14px;}@media only screen and (max-width: 976px) {#uagb-cta-block-.wp-block-uagb-call-to-action.uagb-cta__content-stacked-tablet {display: inherit;}#uagb-cta-block-.uagb-cta__content-stacked-tablet .uagb-cta__wrap{width: 100%;}#uagb-cta-block- .uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__link-wrapper{width: 30%;}#uagb-cta-block- .uagb-cta__wrap{text-align: center;}#uagb-cta-block-.wp-block-uagb-call-to-action {flex-direction: column;align-items: center;}}@media only screen and (max-width: 767px) {#uagb-cta-block-.wp-block-uagb-call-to-action.uagb-cta__content-stacked-mobile {display: inherit;}#uagb-cta-block-.uagb-cta__content-stacked-mobile .uagb-cta__wrap{width: 100%;}#uagb-cta-block- .uagb-cta__buttons{justify-content: center;}#uagb-cta-block- .uagb-cta__content-right .uagb-cta__left-right-wrap .uagb-cta__link-wrapper{width: 30%;}#uagb-cta-block- .uagb-cta__wrap{text-align: center;}#uagb-cta-block-.wp-block-uagb-call-to-action {flex-direction: column;align-items: center;}}.uagb-icon-list__wrap{display:flex;align-items:flex-start;justify-content:flex-start}.wp-block-uagb-icon-list-child{padding:0;transition:all 0.2s;display:inline-flex;color:#3a3a3a;align-items:center;text-decoration:none;box-shadow:none}.wp-block-uagb-icon-list-child span.uagb-icon-list__source-wrap{display:block;align-items:center}.uagb-icon-list__source-wrap svg{display:block}.uagb-icon-list__source-image{width:40px}.uagb-icon-list__outer-wrap .uagb-icon-list__content-wrap{color:#3a3a3a;display:flex;align-items:center}\n.wp-block-uagb-icon-list-child{position:relative}.wp-block-uagb-icon-list-child>a{position:absolute;top:0;left:0;width:100%;height:100%}img.uagb-icon-list__source-image{max-width:unset}.wp-block-uagb-icon-list-child .uagb-icon-list__label{word-break:break-word}\n.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{padding: 0px;border-radius: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__label{text-decoration: !important;line-height: em;}.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: flex-start;-ms-flex-align: flex-start;align-items: flex-start;}.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__label{text-align: left;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child{text-decoration: !important;line-height: em;}.wp-block-uagb-icon-list.uagb-block-f606f41a.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__source-wrap{margin-right: 15px;}.uagb-block-ddf54d80.wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-ddf54d80.wp-block-uagb-icon-list-child:hover .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-b45e4180.wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-b45e4180.wp-block-uagb-icon-list-child:hover .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-6962245c.wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-6962245c.wp-block-uagb-icon-list-child:hover .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}@media only screen and (max-width: 976px) {.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap {padding: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: flex-start;-ms-flex-align: flex-start;align-items: flex-start;}.wp-block-uagb-icon-list.uagb-block-f606f41a.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}}@media only screen and (max-width: 767px) {.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-f606f41a .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{padding: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-f606f41a .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: flex-start;-ms-flex-align: flex-start;align-items: flex-start;}.wp-block-uagb-icon-list.uagb-block-f606f41a.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}}.wp-block-uagb-container{display:flex;position:relative;box-sizing:border-box;transition-property:box-shadow;transition-duration:0.2s;transition-timing-function:ease}.wp-block-uagb-container .spectra-container-link-overlay{bottom:0;left:0;position:absolute;right:0;top:0;z-index:10}.wp-block-uagb-container.uagb-is-root-container{margin-left:auto;margin-right:auto}.wp-block-uagb-container.alignfull.uagb-is-root-container .uagb-container-inner-blocks-wrap{display:flex;position:relative;box-sizing:border-box;margin-left:auto !important;margin-right:auto !important}.wp-block-uagb-container .wp-block-uagb-blockquote,.wp-block-uagb-container .wp-block-spectra-pro-login,.wp-block-uagb-container .wp-block-spectra-pro-register{margin:unset}.wp-block-uagb-container .uagb-container__video-wrap{height:100%;width:100%;top:0;left:0;position:absolute;overflow:hidden;-webkit-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s}.wp-block-uagb-container .uagb-container__video-wrap video{max-width:100%;width:100%;height:100%;margin:0;line-height:1;border:none;display:inline-block;vertical-align:baseline;-o-object-fit:cover;object-fit:cover;background-size:cover}.wp-block-uagb-container.uagb-layout-grid{display:grid;width:100%}.wp-block-uagb-container.uagb-layout-grid>.uagb-container-inner-blocks-wrap{display:inherit;width:inherit}.wp-block-uagb-container.uagb-layout-grid>.uagb-container-inner-blocks-wrap>.wp-block-uagb-container{max-width:unset !important;width:unset !important}.wp-block-uagb-container.uagb-layout-grid>.wp-block-uagb-container{max-width:unset !important;width:unset !important}.wp-block-uagb-container.uagb-layout-grid.uagb-is-root-container{margin-left:auto;margin-right:auto}.wp-block-uagb-container.uagb-layout-grid.uagb-is-root-container>.wp-block-uagb-container{max-width:unset !important;width:unset !important}.wp-block-uagb-container.uagb-layout-grid.alignwide.uagb-is-root-container{margin-left:auto;margin-right:auto}.wp-block-uagb-container.uagb-layout-grid.alignfull.uagb-is-root-container .uagb-container-inner-blocks-wrap{display:inherit;position:relative;box-sizing:border-box;margin-left:auto !important;margin-right:auto !important}body .wp-block-uagb-container>.uagb-container-inner-blocks-wrap>*:not(.wp-block-uagb-container):not(.wp-block-uagb-column):not(.wp-block-uagb-container):not(.wp-block-uagb-section):not(.uagb-container__shape):not(.uagb-container__video-wrap):not(.wp-block-spectra-pro-register):not(.wp-block-spectra-pro-login):not(.uagb-slider-container):not(.spectra-image-gallery__control-lightbox):not(.wp-block-uagb-info-box),body .wp-block-uagb-container>.uagb-container-inner-blocks-wrap,body .wp-block-uagb-container>*:not(.wp-block-uagb-container):not(.wp-block-uagb-column):not(.wp-block-uagb-container):not(.wp-block-uagb-section):not(.uagb-container__shape):not(.uagb-container__video-wrap):not(.wp-block-spectra-pro-register):not(.wp-block-spectra-pro-login):not(.uagb-slider-container):not(.spectra-container-link-overlay):not(.spectra-image-gallery__control-lightbox):not(.wp-block-uagb-lottie):not(.uagb-faq__outer-wrap){min-width:unset !important;width:100%;position:relative}body .ast-container .wp-block-uagb-container>.uagb-container-inner-blocks-wrap>.wp-block-uagb-container>ul,body .ast-container .wp-block-uagb-container>.uagb-container-inner-blocks-wrap>.wp-block-uagb-container ol,body .ast-container .wp-block-uagb-container>.uagb-container-inner-blocks-wrap>ul,body .ast-container .wp-block-uagb-container>.uagb-container-inner-blocks-wrap ol{max-width:-webkit-fill-available;margin-block-start:0;margin-block-end:0;margin-left:20px}.ast-plain-container .editor-styles-wrapper .block-editor-block-list__layout.is-root-container .uagb-is-root-container.wp-block-uagb-container.alignwide{margin-left:auto;margin-right:auto}.uagb-container__shape{overflow:hidden;position:absolute;left:0;width:100%;line-height:0;direction:ltr}.uagb-container__shape-top{top:-3px}.uagb-container__shape-bottom{bottom:-3px}.uagb-container__shape.uagb-container__invert.uagb-container__shape-bottom,.uagb-container__shape.uagb-container__invert.uagb-container__shape-top{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.uagb-container__shape.uagb-container__shape-flip svg{transform:translateX(-50%) rotateY(180deg)}.uagb-container__shape svg{display:block;width:-webkit-calc(100% + 1.3px);width:calc(100% + 1.3px);position:relative;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.uagb-container__shape .uagb-container__shape-fill{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotateY(0deg);transform:rotateY(0deg)}.uagb-container__shape.uagb-container__shape-above-content{z-index:9;pointer-events:none}.nv-single-page-wrap .nv-content-wrap.entry-content .wp-block-uagb-container.alignfull{margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}@media only screen and (max-width: 767px){.wp-block-uagb-container .wp-block-uagb-advanced-heading{width:-webkit-fill-available}}.wp-block-uagb-image--align-none{justify-content:center}\n.wp-block-uagb-container.uagb-block-845e6da6 .uagb-container__shape-top svg{width: calc( 100% + 1.3px );}.wp-block-uagb-container.uagb-block-845e6da6 .uagb-container__shape.uagb-container__shape-top .uagb-container__shape-fill{fill: rgba(51,51,51,1);}.wp-block-uagb-container.uagb-block-845e6da6 .uagb-container__shape-bottom svg{width: calc( 100% + 1.3px );}.wp-block-uagb-container.uagb-block-845e6da6 .uagb-container__shape.uagb-container__shape-bottom .uagb-container__shape-fill{fill: rgba(51,51,51,1);}.wp-block-uagb-container.uagb-block-845e6da6 .uagb-container__video-wrap video{opacity: 1;}.wp-block-uagb-container.uagb-is-root-container .uagb-block-845e6da6{max-width: 100%;width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-845e6da6 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 1200px);max-width: var(--inner-content-custom-width);width: 100%;flex-direction: column;align-items: center;justify-content: center;flex-wrap: nowrap;row-gap: 20px;column-gap: 20px;}.wp-block-uagb-container.uagb-block-845e6da6{box-shadow: 0px 0px   #00000070 ;padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;overflow: visible;order: initial;border-color: inherit;row-gap: 20px;column-gap: 20px;}@media only screen and (max-width: 976px) {.wp-block-uagb-container.uagb-is-root-container .uagb-block-845e6da6{width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-845e6da6 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 1024px);max-width: var(--inner-content-custom-width);width: 100%;}.wp-block-uagb-container.uagb-block-845e6da6{padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;order: initial;}}@media only screen and (max-width: 767px) {.wp-block-uagb-container.uagb-is-root-container .uagb-block-845e6da6{max-width: 100%;width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-845e6da6 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 767px);max-width: var(--inner-content-custom-width);width: 100%;flex-wrap: wrap;}.wp-block-uagb-container.uagb-block-845e6da6{padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;order: initial;}}.wp-block-uagb-icon svg{width:30px}.uagb-icon-wrapper .uagb-svg-wrapper{transition:box-shadow 0.2s ease}\n .uagb-block-2b67c985.uagb-icon-wrapper{text-align: center;} .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper a{display: contents;} .uagb-block-2b67c985.uagb-icon-wrapper svg{width: 40px;height: 40px;transform: rotate(0deg);box-sizing: content-box;fill: #333;filter: drop-shadow( 0px 0px 0px #00000070 );} .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;padding-top: 5px;padding-right: 5px;padding-bottom: 5px;padding-left: 5px;border-style: default;box-shadow: 0px 0px 0 #00000070 ;} .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper:hover{box-shadow: 0px 0px 0 #00000070 ;} .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper:focus-visible{box-shadow: 0px 0px 0 #00000070 ;}@media only screen and (max-width: 976px) { .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;}}@media only screen and (max-width: 767px) { .uagb-block-2b67c985.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;}} .uagb-block-3c223d05.uagb-icon-wrapper{text-align: center;} .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper a{display: contents;} .uagb-block-3c223d05.uagb-icon-wrapper svg{width: 40px;height: 40px;transform: rotate(0deg);box-sizing: content-box;fill: #333;filter: drop-shadow( 0px 0px 0px #00000070 );} .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;padding-top: 5px;padding-right: 5px;padding-bottom: 5px;padding-left: 5px;border-style: default;box-shadow: 0px 0px 0 #00000070 ;} .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper:hover{box-shadow: 0px 0px 0 #00000070 ;} .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper:focus-visible{box-shadow: 0px 0px 0 #00000070 ;}@media only screen and (max-width: 976px) { .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;}}@media only screen and (max-width: 767px) { .uagb-block-3c223d05.uagb-icon-wrapper .uagb-svg-wrapper{display: inline-flex;}}.wp-block-uagb-container.uagb-block-e5b2e3b1 .uagb-container__shape-top svg{width: calc( 100% + 1.3px );}.wp-block-uagb-container.uagb-block-e5b2e3b1 .uagb-container__shape.uagb-container__shape-top .uagb-container__shape-fill{fill: rgba(51,51,51,1);}.wp-block-uagb-container.uagb-block-e5b2e3b1 .uagb-container__shape-bottom svg{width: calc( 100% + 1.3px );}.wp-block-uagb-container.uagb-block-e5b2e3b1 .uagb-container__shape.uagb-container__shape-bottom .uagb-container__shape-fill{fill: rgba(51,51,51,1);}.wp-block-uagb-container.uagb-block-e5b2e3b1 .uagb-container__video-wrap video{opacity: 1;}.wp-block-uagb-container.uagb-is-root-container .uagb-block-e5b2e3b1{max-width: 100%;width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-e5b2e3b1 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 1200px);max-width: var(--inner-content-custom-width);width: 100%;flex-direction: column;align-items: center;justify-content: center;flex-wrap: nowrap;row-gap: 20px;column-gap: 20px;}.wp-block-uagb-container.uagb-block-e5b2e3b1{box-shadow: 0px 0px   #00000070 ;padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;overflow: visible;order: initial;border-color: inherit;row-gap: 20px;column-gap: 20px;}@media only screen and (max-width: 976px) {.wp-block-uagb-container.uagb-is-root-container .uagb-block-e5b2e3b1{width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-e5b2e3b1 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 1024px);max-width: var(--inner-content-custom-width);width: 100%;}.wp-block-uagb-container.uagb-block-e5b2e3b1{padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;order: initial;}}@media only screen and (max-width: 767px) {.wp-block-uagb-container.uagb-is-root-container .uagb-block-e5b2e3b1{max-width: 100%;width: 100%;}.wp-block-uagb-container.uagb-is-root-container.alignfull.uagb-block-e5b2e3b1 > .uagb-container-inner-blocks-wrap{--inner-content-custom-width: min( 100%, 767px);max-width: var(--inner-content-custom-width);width: 100%;flex-wrap: wrap;}.wp-block-uagb-container.uagb-block-e5b2e3b1{padding-top: 10px;padding-bottom: 10px;padding-left: 10px;padding-right: 10px;margin-top:  !important;margin-bottom:  !important;order: initial;}}\";s:2:\"js\";s:2038:\"document.addEventListener(\"DOMContentLoaded\", function(){ var ssLinksParent = document.querySelector( '.uagb-block-015f0124' );\nssLinksParent?.addEventListener( 'keyup', function ( e ) {\nvar link = e.target.closest( '.uagb-ss__link' );\nif ( link && e.keyCode === 13 ) {\n\thandleSocialLinkClick( link );\n}\n});\n\nssLinksParent?.addEventListener( 'click', function ( e ) {\nvar link = e.target.closest( '.uagb-ss__link' );\nif ( link ) {\n\thandleSocialLinkClick( link );\n}\n});\n\nfunction handleSocialLinkClick( link ) {\nvar social_url = link.dataset.href;\nvar target = \"\";\nif ( social_url == \"mailto:?body=\" ) {\n\ttarget = \"_self\";\n}\nvar request_url = \"\";\nif ( social_url.indexOf(\"\/pin\/create\/link\/?url=\") !== -1 ) {\n\trequest_url = social_url + encodeURIComponent( window.location.href ) + \"&media=\" + 'https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed.webp';\n} else {\n\trequest_url = social_url + encodeURIComponent( window.location.href );\n}\nwindow.open( request_url, target );\n}\n\t\t\t\twindow.addEventListener( 'DOMContentLoaded', () => {\n\t\t\t\t\tconst blockScope = document.querySelector( '.uagb-block-2b67c985' );\n\t\t\t\t\tif ( ! blockScope ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst anchorElement = blockScope.querySelector('a');\n\t\t\t\t\tif (!anchorElement) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} \n\n\t\t\t\t\t \n\t\t\t\t\tblockScope.addEventListener('keydown', (event) => {\n\t\t\t\t\t\tif ( 13 === event.keyCode || 32 === event.keyCode ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\tanchorElement.click();\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\t\t\t\twindow.addEventListener( 'DOMContentLoaded', () => {\n\t\t\t\t\tconst blockScope = document.querySelector( '.uagb-block-3c223d05' );\n\t\t\t\t\tif ( ! blockScope ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst anchorElement = blockScope.querySelector('a');\n\t\t\t\t\tif (!anchorElement) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} \n\n\t\t\t\t\t \n\t\t\t\t\tblockScope.addEventListener('keydown', (event) => {\n\t\t\t\t\t\tif ( 13 === event.keyCode || 32 === event.keyCode ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\tanchorElement.click();\t\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t });\";s:18:\"current_block_list\";a:19:{i:0;s:11:\"core\/search\";i:1;s:10:\"core\/group\";i:2;s:12:\"core\/heading\";i:3;s:17:\"core\/latest-posts\";i:4;s:20:\"core\/latest-comments\";i:5;s:13:\"core\/archives\";i:6;s:15:\"core\/categories\";i:7;s:10:\"core\/image\";i:8;s:14:\"core\/paragraph\";i:9;s:10:\"core\/embed\";i:10;s:17:\"uagb\/social-share\";i:11;s:23:\"uagb\/social-share-child\";i:12;s:19:\"uagb\/call-to-action\";i:13;s:14:\"uagb\/icon-list\";i:14;s:20:\"uagb\/icon-list-child\";i:15;s:14:\"uagb\/container\";i:16;s:9:\"uagb\/icon\";i:17;s:17:\"core\/social-links\";i:18;s:16:\"core\/social-link\";}s:8:\"uag_flag\";b:1;s:11:\"uag_version\";s:10:\"1776063796\";s:6:\"gfonts\";a:0:{}s:10:\"gfonts_url\";s:0:\"\";s:12:\"gfonts_files\";a:0:{}s:14:\"uag_faq_layout\";b:0;}"],"_elementor_controls_usage":["a:3:{s:11:\"text-editor\";a:3:{s:5:\"count\";i:3;s:15:\"control_percent\";i:1;s:8:\"controls\";a:2:{s:7:\"content\";a:1:{s:14:\"section_editor\";a:1:{s:6:\"editor\";i:3;}}s:8:\"advanced\";a:1:{s:26:\"display_conditions_section\";a:1:{s:22:\"display_condition_list\";i:3;}}}}s:14:\"code-highlight\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:1;s:8:\"controls\";a:2:{s:7:\"content\";a:1:{s:15:\"section_content\";a:2:{s:8:\"language\";i:2;s:4:\"code\";i:2;}}s:8:\"advanced\";a:1:{s:26:\"display_conditions_section\";a:1:{s:22:\"display_condition_list\";i:2;}}}}s:9:\"container\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:8:\"advanced\";a:1:{s:26:\"display_conditions_section\";a:1:{s:22:\"display_condition_list\";i:1;}}}}}"],"_elementor_page_assets":["a:2:{s:7:\"scripts\";a:7:{i:0;s:18:\"elementor-frontend\";i:1;s:12:\"prismjs_core\";i:2;s:14:\"prismjs_loader\";i:3;s:17:\"prismjs_normalize\";i:4;s:17:\"highlight_handler\";i:5;s:20:\"prismjs_line_numbers\";i:6;s:25:\"prismjs_copy_to_clipboard\";}s:6:\"styles\";a:1:{i:0;s:21:\"widget-code-highlight\";}}"],"_elementor_css":["a:6:{s:4:\"time\";i:1775559886;s:5:\"fonts\";a:0:{}s:5:\"icons\";a:0:{}s:20:\"dynamic_elements_ids\";a:0:{}s:6:\"status\";s:4:\"file\";i:0;s:0:\"\";}"],"_elementor_element_cache":["{\"timeout\":1776477036,\"value\":{\"content\":\"<div class=\\\"elementor-element elementor-element-733c0b06 e-flex e-con-boxed e-con e-parent\\\" data-id=\\\"733c0b06\\\" data-element_type=\\\"container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"e-con-inner\\\">\\n\\t\\t[elementor-element k=\\\"0e46bd9387093ca73b9000e38f18cce4\\\" data=\\\"eyJpZCI6IjYyNjk4NDZkIiwiZWxUeXBlIjoid2lkZ2V0Iiwic2V0dGluZ3MiOnsiZWRpdG9yIjoiPHAgZGF0YS1zdGFydD1cIjQ5XCIgZGF0YS1lbmQ9XCI0NjFcIj5UaGVyZSBhcmUgbm8gZ3JlYXQgaW5kaXZpZHVhbHMsIG9ubHkgZ3JlYXQgdGVhbXMuIFdpdGggdGhlIHRlYW0gd29ya2luZyB0b2dldGhlciwgdGhlIGZpcnN0LXN0YWdlIFBDQiBDQU0gYXV0b21hdGlvbiBwcm9qZWN0IGZvciA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIxNzhcIiBkYXRhLWVuZD1cIjE5NFwiPm5ldCBoYW5kbGluZzxcL3N0cm9uZz4gYW5kIDxzdHJvbmcgZGF0YS1zdGFydD1cIjE5OVwiIGRhdGEtZW5kPVwiMjE3XCI+ZHJpbGwgaGFuZGxpbmc8XC9zdHJvbmc+IGlzIGRvbmUuIE5leHQsIHdlIGNhbiBtb3ZlIG9uIHRvIHRoZSBQQ0IgcnVsZXMgZW5naW5lLiBIZXJlIEkgdGFsayBhYm91dCBkcmlsbCBjb21wZW5zYXRpb24gaW4gUENCIGVuZ2luZWVyaW5nLiBBcyBhIFBDQiBlbmdpbmVlcmluZyBkZXZlbG9wZXIsIHlvdSBzaG91bGQga25vdyB3aGF0IGl0IGlzIGFuZCB3aHkgaXQgd29ya3MuIEkgc2hhcmUgdGhlIGtleSBwb2ludHMgYWJvdXQgZHJpbGwgY29tcGVuc2F0aW9uIGJlbG93LjxcL3A+XG48aHIgZGF0YS1zdGFydD1cIjQ2M1wiIGRhdGEtZW5kPVwiNDY2XCIgXC8+XG48aDIgZGF0YS1zdGFydD1cIjQ2OFwiIGRhdGEtZW5kPVwiNTA3XCI+MS4gV2h5IGRvIHdlIGNvbXBlbnNhdGUgZHJpbGwgc2l6ZXM\\\/PFwvaDI+XG48cCBkYXRhLXN0YXJ0PVwiNTA5XCIgZGF0YS1lbmQ9XCI4NzBcIj5UaGUgaG9sZSBzaXplcyBpbiB0aGUgUENCIGZpbGVzIHRoZSBjdXN0b21lciBnaXZlcyB1c3VhbGx5IG1lYW4gdGhlIDxlbSBkYXRhLXN0YXJ0PVwiNTc3XCIgZGF0YS1lbmQ9XCI1ODRcIj5maW5hbDxcL2VtPiBob2xlIHNpemUuIER1cmluZyBQQ0IgcHJvZHVjdGlvbiwgY29wcGVyIGlzIHBsYXRlZCBpbnNpZGUgdGhlIGhvbGVzIChvciB0aGUgaG9sZXMgZ2V0IGEgc3VyZmFjZSBmaW5pc2ggc3VjaCBhcyBIQVNMLCBFTklHLCBPU1AsIGV0Yy4pLiBUaGlzIG1ha2VzIHRoZSBob2xlIHNtYWxsZXIuIFRvIG1ha2Ugc3VyZSB0aGUgZmluYWwgaG9sZSBzaXplIG1lZXRzIHRoZSByZXF1aXJlbWVudCwgdGhlIENBTSBzdGVwIGNvcnJlY3RzIHRoZSBkcmlsbCBzaXplLiBUaGlzIGlzIGRyaWxsIGNvbXBlbnNhdGlvbi48XC9wPlxuPHAgZGF0YS1zdGFydD1cIjg3MlwiIGRhdGEtZW5kPVwiMTE3MVwiPjxzdHJvbmcgZGF0YS1zdGFydD1cIjg3MlwiIGRhdGEtZW5kPVwiODg5XCI+UmVhbCBleGFtcGxlOjxcL3N0cm9uZz48YnIgZGF0YS1zdGFydD1cIjg4OVwiIGRhdGEtZW5kPVwiODkyXCIgXC8+RmluYWwgaG9sZSBzaXplOiA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI5MDlcIiBkYXRhLWVuZD1cIjkyMFwiPjEuMDAgbW08XC9zdHJvbmc+LiBTdXJmYWNlIGZpbmlzaDogPHN0cm9uZyBkYXRhLXN0YXJ0PVwiOTM4XCIgZGF0YS1lbmQ9XCI5NDZcIj5FTklHPFwvc3Ryb25nPiAobmlja2VsIHRoaWNrbmVzcyAyLjU0IFx1MDBiNW0sIGdvbGQgdGhpY2tuZXNzIDAuMDI1NCBcdTAwYjVtKS4gRm9sbG93IElQQyBDbGFzcyBJSSBhbmQgdGhlIGF2ZXJhZ2UgcGxhdGVkIGNvcHBlciB0aGlja25lc3MgaXMgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTA2NFwiIGRhdGEtZW5kPVwiMTA3M1wiPjIwIFx1MDBiNW08XC9zdHJvbmc+LiBJZiB3ZSB1c2UgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTA4NVwiIGRhdGEtZW5kPVwiMTA5NlwiPjAuMTAgbW08XC9zdHJvbmc+IGFzIHRoZSBjb21wZW5zYXRpb24gdmFsdWUsIHRoZSBDQU0gdGVhbSB3aWxsIHBpY2sgYSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIxMTQ5XCIgZGF0YS1lbmQ9XCIxMTYwXCI+MS4xMCBtbTxcL3N0cm9uZz4gZHJpbGwgYml0LjxcL3A+XG48cCBkYXRhLXN0YXJ0PVwiODcyXCIgZGF0YS1lbmQ9XCIxMTcxXCI+PGltZyBjbGFzcz1cImFsaWdubm9uZSBzaXplLWZ1bGwgd3AtaW1hZ2UtNDU3OFwiIHNyYz1cImh0dHBzOlwvXC9mbGotcGNiLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNVwvMTJcL1JlYWwtZXhhbXBsZS53ZWJwXCIgYWx0PVwiUmVhbCBleGFtcGxlXCIgd2lkdGg9XCIzMzZcIiBoZWlnaHQ9XCIyOTdcIiBcLz48XC9wPlxuPGhyIGRhdGEtc3RhcnQ9XCIxMTczXCIgZGF0YS1lbmQ9XCIxMTc2XCIgXC8+XG48aDIgZGF0YS1zdGFydD1cIjExNzhcIiBkYXRhLWVuZD1cIjEyMTZcIj4yLiBIb3cgZG8gd2UgZG8gZHJpbGwgY29tcGVuc2F0aW9uPzxcL2gyPlxuPHAgZGF0YS1zdGFydD1cIjEyMThcIiBkYXRhLWVuZD1cIjE0NDVcIj5GaXJzdCwgYmUgY2xlYXIgYWJvdXQgdGhlIHRocmVlIGtleSBwYXJhbWV0ZXJzIGZvciBkcmlsbCBjb21wZW5zYXRpb246PGJyIGRhdGEtc3RhcnQ9XCIxMjg4XCIgZGF0YS1lbmQ9XCIxMjkxXCIgXC8+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTI5MVwiIGRhdGEtZW5kPVwiMTI5OFwiPigxKTxcL3N0cm9uZz4gRHJpbGwgYml0IGluY3JlbWVudCw8YnIgZGF0YS1zdGFydD1cIjEzMTlcIiBkYXRhLWVuZD1cIjEzMjJcIiBcLz48c3Ryb25nIGRhdGEtc3RhcnQ9XCIxMzIyXCIgZGF0YS1lbmQ9XCIxMzI5XCI+KDIpPFwvc3Ryb25nPiBDb21wZW5zYXRpb24gdmFsdWUsPGJyIGRhdGEtc3RhcnQ9XCIxMzQ5XCIgZGF0YS1lbmQ9XCIxMzUyXCIgXC8+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTM1MlwiIGRhdGEtZW5kPVwiMTM1OVwiPigzKTxcL3N0cm9uZz4gU3RlcC11cCB0aHJlc2hvbGQgKGFkdmFuY2UgdmFsdWUpLjxiciBkYXRhLXN0YXJ0PVwiMTM5NFwiIGRhdGEtZW5kPVwiMTM5N1wiIFwvPlRoZXNlIHRocmVlIGRldGVybWluZSBob3cgdG8gYXBwbHkgY29tcGVuc2F0aW9uLjxcL3A+XG48aDMgZGF0YS1zdGFydD1cIjE0NDdcIiBkYXRhLWVuZD1cIjE0NzVcIj4xKSBEcmlsbCBiaXQgaW5jcmVtZW50PFwvaDM+XG48cCBkYXRhLXN0YXJ0PVwiMTQ3NlwiIGRhdGEtZW5kPVwiMTc3M1wiPlRoaXMgZGVwZW5kcyBvbiB0aGUgZHJpbGwgYml0cyB0aGUgY29tcGFueSBidXlzLiBUaGUgaW5kdXN0cnkgY29tbW9uIGluY3JlbWVudCBpcyA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIxNTU4XCIgZGF0YS1lbmQ9XCIxNTY3XCI+NTAgXHUwMGI1bTxcL3N0cm9uZz4uIFR5cGljYWwgZHJpbGwgc2l6ZXMgcmFuZ2UgZnJvbSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIxNjAwXCIgZGF0YS1lbmQ9XCIxNjExXCI+MC4xMCBtbTxcL3N0cm9uZz4gdG8gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTYxNVwiIGRhdGEtZW5kPVwiMTYyNlwiPjYuMzUgbW08XC9zdHJvbmc+LiBUaGUgdXN1YWwgc21hbGxlc3Qgc3RlcCBiZXR3ZWVuIGRyaWxsIGJpdHMgaXMgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTY3NFwiIGRhdGEtZW5kPVwiMTY4NVwiPjAuMDUgbW08XC9zdHJvbmc+LiBTbyB0aGUgZHJpbGwgbGlicmFyeSBoYXMgc2l6ZXMgbGlrZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIxNzIzXCIgZGF0YS1lbmQ9XCIxNzYxXCI+MC4xMCBtbSwgMC4xNSBtbSwgMC4yMCBtbSwgMC4yNSBtbTxcL3N0cm9uZz4sIGFuZCBzbyBvbi48XC9wPlxuPGgzIGRhdGEtc3RhcnQ9XCIxNzc1XCIgZGF0YS1lbmQ9XCIxODAyXCI+MikgQ29tcGVuc2F0aW9uIHZhbHVlPFwvaDM+XG48cCBkYXRhLXN0YXJ0PVwiMTgwM1wiIGRhdGEtZW5kPVwiMTk1MlwiPlRoZSBwcm9jZXNzIHRlYW0gc2V0cyB0aGUgY29tcGVuc2F0aW9uIHJ1bGVzIGJhc2VkIG9uIGZhY3RvcnkgdGVzdCByZXN1bHRzLiBDb21wZW5zYXRpb24gdmFsdWVzIGRvIG5vdCB2YXJ5IG11Y2ggYWNyb3NzIHRoZSBpbmR1c3RyeS4gQ29tbW9uIHJ1bGVzOjxcL3A+XG48dWwgZGF0YS1zdGFydD1cIjE5NTNcIiBkYXRhLWVuZD1cIjIwOThcIj5cbjxsaSBkYXRhLXN0YXJ0PVwiMTk1M1wiIGRhdGEtZW5kPVwiMjAxNFwiPlxuPHAgZGF0YS1zdGFydD1cIjE5NTVcIiBkYXRhLWVuZD1cIjIwMTRcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCIxOTU1XCIgZGF0YS1lbmQ9XCIxOTc1XCI+Qm9hcmRzIHdpdGggSEFTTDxcL3N0cm9uZz4gKHNwcmF5IHRpbik6IDxzdHJvbmcgZGF0YS1zdGFydD1cIjE5ODlcIiBkYXRhLWVuZD1cIjIwMTFcIj5jb21wZW5zYXRlIDAuMTUgbW08XC9zdHJvbmc+LjxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiMjAxNVwiIGRhdGEtZW5kPVwiMjA5OFwiPlxuPHAgZGF0YS1zdGFydD1cIjIwMTdcIiBkYXRhLWVuZD1cIjIwOThcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCIyMDE3XCIgZGF0YS1lbmQ9XCIyMDQwXCI+Qm9hcmRzIHdpdGhvdXQgSEFTTDxcL3N0cm9uZz4gKEVOSUcsIGltbWVyc2lvbiB0aW4sIE9TUCwgZXRjLik6IDxzdHJvbmcgZGF0YS1zdGFydD1cIjIwNzVcIiBkYXRhLWVuZD1cIjIwOTdcIj5jb21wZW5zYXRlIDAuMTAgbW08XC9zdHJvbmc+LjxcL3A+XG48XC9saT5cbjxcL3VsPlxuPGgzIGRhdGEtc3RhcnQ9XCIyMTAwXCIgZGF0YS1lbmQ9XCIyMTQyXCI+MykgU3RlcC11cCB0aHJlc2hvbGQgKGFkdmFuY2UgdmFsdWUpPFwvaDM+XG48cCBkYXRhLXN0YXJ0PVwiMjE0M1wiIGRhdGEtZW5kPVwiMjQwM1wiPlRoZSBwcm9jZXNzIHRlYW0gYWxzbyBzZXRzIHRoZSBzdHJhdGVneSBmb3IgcGlja2luZyB0aGUgZHJpbGwgYml0LCBzaW1pbGFyIHRvIGEgcm91bmRpbmcgcnVsZS4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIGluY3JlbWVudCBpcyA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyMjczXCIgZGF0YS1lbmQ9XCIyMjgyXCI+MjAgXHUwMGI1bTxcL3N0cm9uZz4sIGlmIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYnkgdGhlIGluY3JlbWVudCBpcyA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyMzM2XCIgZGF0YS1lbmQ9XCIyMzQ3XCI+XHUyMjY1IDIwIFx1MDBiNW08XC9zdHJvbmc+LCB5b3Ugcm91bmQgdXAgNTAgXHUwMGI1bTsgb3RoZXJ3aXNlIHlvdSBrZWVwIHRoZSBsb3dlciBzaXplLjxcL3A+XG48cCBkYXRhLXN0YXJ0PVwiMjQwNVwiIGRhdGEtZW5kPVwiMjczN1wiPjxzdHJvbmcgZGF0YS1zdGFydD1cIjI0MDVcIiBkYXRhLWVuZD1cIjI0MTdcIj5FeGFtcGxlOjxcL3N0cm9uZz48YnIgZGF0YS1zdGFydD1cIjI0MTdcIiBkYXRhLWVuZD1cIjI0MjBcIiBcLz5GaW5hbCBob2xlIHNpemUgPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyNDM4XCIgZGF0YS1lbmQ9XCIyNDUwXCI+MS4wMjUgbW08XC9zdHJvbmc+LCBjb21wZW5zYXRpb24gPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyNDY3XCIgZGF0YS1lbmQ9XCIyNDc4XCI+MC4xMCBtbTxcL3N0cm9uZz4sIHNvIGNvbXBlbnNhdGVkIHNpemUgPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyNTAyXCIgZGF0YS1lbmQ9XCIyNTE0XCI+MS4xMjUgbW08XC9zdHJvbmc+LiBCdXQgdGhlcmUgaXMgbm8gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMjUzMlwiIGRhdGEtZW5kPVwiMjU0NFwiPjEuMTI1IG1tPFwvc3Ryb25nPiBkcmlsbCBpbiB0aGUgbGlicmFyeS4gVXNlIHRoZSBzdGVwLXVwIHJ1bGUuIFRoZSByZW1haW5kZXIgb2YgMS4xMjUgbW0gd2hlbiBjb21wYXJlZCB0byB0aGUgMC4wNSBtbSBzdGVwIGlzIDxzdHJvbmcgZGF0YS1zdGFydD1cIjI2NTJcIiBkYXRhLWVuZD1cIjI2NjFcIj4yNSBcdTAwYjVtPFwvc3Ryb25nPi4gU2luY2UgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMjY2OVwiIGRhdGEtZW5kPVwiMjY4NlwiPjI1IFx1MDBiNW0gJmd0OyAyMCBcdTAwYjVtPFwvc3Ryb25nPiwgcm91bmQgdXAgYnkgNTAgXHUwMGI1bSBhbmQgY2hvb3NlIGEgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMjcxOVwiIGRhdGEtZW5kPVwiMjczMFwiPjEuMTUgbW08XC9zdHJvbmc+IGRyaWxsLjxcL3A+XG48aHIgZGF0YS1zdGFydD1cIjI3MzlcIiBkYXRhLWVuZD1cIjI3NDJcIiBcLz5cbjxoMyBkYXRhLXN0YXJ0PVwiMjc0NFwiIGRhdGEtZW5kPVwiMjc4MlwiPkFjdHVhbCBkcmlsbCBjb21wZW5zYXRpb24gZXhhbXBsZXM8XC9oMz5cbjxwIGRhdGEtc3RhcnQ9XCIyNzg0XCIgZGF0YS1lbmQ9XCIyODUwXCI+QXNzdW1lOiBkcmlsbCBpbmNyZW1lbnQgPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIyODEwXCIgZGF0YS1lbmQ9XCIyODE5XCI+NTAgXHUwMGI1bTxcL3N0cm9uZz4sIHN0ZXAtdXAgdGhyZXNob2xkID0gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMjg0MVwiIGRhdGEtZW5kPVwiMjg1MFwiPjIwIFx1MDBiNW08XC9zdHJvbmc+PFwvcD5cbjxkaXYgY2xhc3M9XCJUeWFnR1dfdGFibGVDb250YWluZXJcIj5cbjxkaXYgY2xhc3M9XCJncm91cCBUeWFnR1dfdGFibGVXcmFwcGVyIGZsZXggdy1maXQgZmxleC1jb2wtcmV2ZXJzZVwiIHRhYmluZGV4PVwiLTFcIj5cbjx0YWJsZSBjbGFzcz1cInctZml0IG1pbi13LSgtLXRocmVhZC1jb250ZW50LXdpZHRoKVwiIGRhdGEtc3RhcnQ9XCIyODUyXCIgZGF0YS1lbmQ9XCIzMDk3XCI+XG48dGhlYWQgZGF0YS1zdGFydD1cIjI4NTJcIiBkYXRhLWVuZD1cIjI5NDdcIj5cbjx0ciBkYXRhLXN0YXJ0PVwiMjg1MlwiIGRhdGEtZW5kPVwiMjk0N1wiPlxuPHRoIGRhdGEtc3RhcnQ9XCIyODUyXCIgZGF0YS1lbmQ9XCIyODY4XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+T3JpZ2luYWwgaG9sZTxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCIyODY4XCIgZGF0YS1lbmQ9XCIyODgzXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+Q29tcGVuc2F0aW9uPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjI4ODNcIiBkYXRhLWVuZD1cIjI5MDRcIiBkYXRhLWNvbC1zaXplPVwic21cIj5BZnRlciBjb21wZW5zYXRpb248XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiMjkwNFwiIGRhdGEtZW5kPVwiMjkxOVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkludGVnZXIgcGFydDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCIyOTE5XCIgZGF0YS1lbmQ9XCIyOTMxXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+UmVtYWluZGVyPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjI5MzFcIiBkYXRhLWVuZD1cIjI5NDdcIiBkYXRhLWNvbC1zaXplPVwic21cIj5EcmlsbCBjaG9zZW48XC90aD5cbjxcL3RyPlxuPFwvdGhlYWQ+XG48dGJvZHkgZGF0YS1zdGFydD1cIjI5ODBcIiBkYXRhLWVuZD1cIjMwOTdcIj5cbjx0ciBkYXRhLXN0YXJ0PVwiMjk4MFwiIGRhdGEtZW5kPVwiMzAzOFwiPlxuPHRkIGRhdGEtc3RhcnQ9XCIyOTgwXCIgZGF0YS1lbmQ9XCIyOTkxXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+MS4wMjUgbW08XC90ZD5cbjx0ZCBkYXRhLXN0YXJ0PVwiMjk5MVwiIGRhdGEtZW5kPVwiMjk5OFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjAuMTA8XC90ZD5cbjx0ZCBkYXRhLXN0YXJ0PVwiMjk5OFwiIGRhdGEtZW5kPVwiMzAwOVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjEuMTI1IG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjMwMDlcIiBkYXRhLWVuZD1cIjMwMTZcIj4xLjEwPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjMwMTZcIiBkYXRhLWVuZD1cIjMwMjdcIj4wLjAyNSBtbTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIzMDI3XCIgZGF0YS1lbmQ9XCIzMDM4XCI+MS4xNSBtbTxcL3RkPlxuPFwvdHI+XG48dHIgZGF0YS1zdGFydD1cIjMwMzlcIiBkYXRhLWVuZD1cIjMwOTdcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiMzAzOVwiIGRhdGEtZW5kPVwiMzA1MFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjEuMDE2IG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjMwNTBcIiBkYXRhLWVuZD1cIjMwNTdcIj4wLjEwPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjMwNTdcIiBkYXRhLWVuZD1cIjMwNjhcIj4xLjExNiBtbTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIzMDY4XCIgZGF0YS1lbmQ9XCIzMDc1XCI+MS4xMDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIzMDc1XCIgZGF0YS1lbmQ9XCIzMDg2XCI+MC4wMTYgbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMzA4NlwiIGRhdGEtZW5kPVwiMzA5N1wiPjEuMTAgbW08XC90ZD5cbjxcL3RyPlxuPFwvdGJvZHk+XG48XC90YWJsZT5cbjxcL2Rpdj5cbjxcL2Rpdj5cbjxoNCBkYXRhLXN0YXJ0PVwiMzA5OVwiIGRhdGEtZW5kPVwiMzE0MFwiPkhvdyB0byBjb21wdXRlIHRoZSBjaG9zZW4gZHJpbGwgc2l6ZTxcL2g0PlxuPHAgZGF0YS1zdGFydD1cIjMxNDFcIiBkYXRhLWVuZD1cIjMyNDFcIj5CcmVhayB0aGUgY29tcGVuc2F0ZWQgaG9sZSBzaXplIGludG8gYW4gaW50ZWdlciBwYXJ0IGFuZCBhIHJlbWFpbmRlciBwYXJ0IHVzaW5nIHRoZSBkcmlsbCBpbmNyZW1lbnQ6PFwvcD5cbjxwIGRhdGEtc3RhcnQ9XCIzMjQzXCIgZGF0YS1lbmQ9XCIzMzk2XCI+VGFrZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIzMjQ4XCIgZGF0YS1lbmQ9XCIzMjYwXCI+MS4xMjUgbW08XC9zdHJvbmc+IGFzIGFuIGV4YW1wbGU6PGJyIGRhdGEtc3RhcnQ9XCIzMjc1XCIgZGF0YS1lbmQ9XCIzMjc4XCIgXC8+MS4xMjUgXC8gMC4wNSA9IDIyLjUgXHUyMTkyIGZsb29yIHRvIDIyIFx1MjE5MiBpbnRlZ2VyIHBhcnQgPSAyMiBcdTAwZDcgMC4wNSA9IDxzdHJvbmcgZGF0YS1zdGFydD1cIjMzNDFcIiBkYXRhLWVuZD1cIjMzNTJcIj4xLjEwIG1tPFwvc3Ryb25nPi48YnIgZGF0YS1zdGFydD1cIjMzNTNcIiBkYXRhLWVuZD1cIjMzNTZcIiBcLz5SZW1haW5kZXIgPSAxLjEyNSAlIDAuMDUgPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCIzMzgzXCIgZGF0YS1lbmQ9XCIzMzk1XCI+MC4wMjUgbW08XC9zdHJvbmc+LjxcL3A+XG48cCBkYXRhLXN0YXJ0PVwiMzM5OFwiIGRhdGEtZW5kPVwiMzQ3NVwiPlRoZW4gY29tcGFyZSB0aGUgcmVtYWluZGVyIHdpdGggdGhlIHN0ZXAtdXAgdGhyZXNob2xkIChmb3IgZXhhbXBsZSwgMjAgXHUwMGI1bSk6PFwvcD5cbjx1bCBkYXRhLXN0YXJ0PVwiMzQ3NlwiIGRhdGEtZW5kPVwiMzYwN1wiPlxuPGxpIGRhdGEtc3RhcnQ9XCIzNDc2XCIgZGF0YS1lbmQ9XCIzNTQyXCI+XG48cCBkYXRhLXN0YXJ0PVwiMzQ3OFwiIGRhdGEtZW5kPVwiMzU0MlwiPklmIHJlbWFpbmRlciAmZ3Q7IHRocmVzaG9sZCwgZHJpbGwgc2l6ZSA9IGludGVnZXIgcGFydCArIDAuMDUgbW0uPFwvcD5cbjxcL2xpPlxuPGxpIGRhdGEtc3RhcnQ9XCIzNTQzXCIgZGF0YS1lbmQ9XCIzNjA3XCI+XG48cCBkYXRhLXN0YXJ0PVwiMzU0NVwiIGRhdGEtZW5kPVwiMzYwN1wiPklmIHJlbWFpbmRlciBcdTIyNjQgdGhyZXNob2xkLCBkcmlsbCBzaXplID0gaW50ZWdlciBwYXJ0ICsgMC4wMCBtbS48XC9wPlxuPFwvbGk+XG48XC91bD5cbjxociBkYXRhLXN0YXJ0PVwiMzYwOVwiIGRhdGEtZW5kPVwiMzYxMlwiIFwvPlxuPGgzIGRhdGEtc3RhcnQ9XCIzNjE0XCIgZGF0YS1lbmQ9XCIzNjUzXCI+U3VtbWFyeSBhYm91dCB0aGUgc3RlcC11cCB0aHJlc2hvbGQ8XC9oMz5cbjxwIGRhdGEtc3RhcnQ9XCIzNjU0XCIgZGF0YS1lbmQ9XCIzODk3XCI+V2hlbiB0aGUgZHJpbGwgaW5jcmVtZW50IGlzIDxzdHJvbmcgZGF0YS1zdGFydD1cIjM2ODJcIiBkYXRhLWVuZD1cIjM2OTFcIj41MCBcdTAwYjVtPFwvc3Ryb25nPiwgdGhlIHN0ZXAtdXAgdGhyZXNob2xkIGlzIGNyaXRpY2FsLiBJdCBwZXJmb3JtcyBhIHNlY29uZCBjb3JyZWN0aW9uIG9mIHRoZSBjb21wZW5zYXRlZCBkcmlsbCBzaXplLiBJdCBkZWNpZGVzIHdoZXRoZXIgdG8gXHUyMDFjc3RlcCB1cFx1MjAxZCBvciBcdTIwMWNzdGF5Llx1MjAxZCBDaGFuZ2luZyB0aGlzIHRocmVzaG9sZCBkaXJlY3RseSBjaGFuZ2VzIHRoZSBjaG9zZW4gZHJpbGwgc2l6ZS48XC9wPlxuPHAgZGF0YS1zdGFydD1cIjM4OTlcIiBkYXRhLWVuZD1cIjM5NDNcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCIzODk5XCIgZGF0YS1lbmQ9XCIzOTQzXCI+TW9yZSBleGFtcGxlcyAoZHJpbGwgaW5jcmVtZW50ID0gNTAgXHUwMGI1bSk6PFwvc3Ryb25nPjxcL3A+XG48ZGl2IGNsYXNzPVwiVHlhZ0dXX3RhYmxlQ29udGFpbmVyXCI+XG48ZGl2IGNsYXNzPVwiZ3JvdXAgVHlhZ0dXX3RhYmxlV3JhcHBlciBmbGV4IHctZml0IGZsZXgtY29sLXJldmVyc2VcIiB0YWJpbmRleD1cIi0xXCI+XG48dGFibGUgY2xhc3M9XCJ3LWZpdCBtaW4tdy0oLS10aHJlYWQtY29udGVudC13aWR0aClcIiBkYXRhLXN0YXJ0PVwiMzk0NVwiIGRhdGEtZW5kPVwiNDIwOVwiPlxuPHRoZWFkIGRhdGEtc3RhcnQ9XCIzOTQ1XCIgZGF0YS1lbmQ9XCI0MDQxXCI+XG48dHIgZGF0YS1zdGFydD1cIjM5NDVcIiBkYXRhLWVuZD1cIjQwNDFcIj5cbjx0aCBkYXRhLXN0YXJ0PVwiMzk0NVwiIGRhdGEtZW5kPVwiMzk2MVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPk9yaWdpbmFsIGhvbGU8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiMzk2MVwiIGRhdGEtZW5kPVwiMzk3NlwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkNvbXBlbnNhdGlvbjxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCIzOTc2XCIgZGF0YS1lbmQ9XCIzOTkwXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+QWZ0ZXIgY29tcC48XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiMzk5MFwiIGRhdGEtZW5kPVwiNDAwMFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkludGVnZXI8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiNDAwMFwiIGRhdGEtZW5kPVwiNDAxMlwiIGRhdGEtY29sLXNpemU9XCJzbVwiPlJlbWFpbmRlcjxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI0MDEyXCIgZGF0YS1lbmQ9XCI0MDMyXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+U3RlcC11cCB0aHJlc2hvbGQ8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiNDAzMlwiIGRhdGEtZW5kPVwiNDA0MVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkRyaWxsPFwvdGg+XG48XC90cj5cbjxcL3RoZWFkPlxuPHRib2R5IGRhdGEtc3RhcnQ9XCI0MDc5XCIgZGF0YS1lbmQ9XCI0MjA5XCI+XG48dHIgZGF0YS1zdGFydD1cIjQwNzlcIiBkYXRhLWVuZD1cIjQxNDNcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiNDA3OVwiIGRhdGEtZW5kPVwiNDA5MFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjEuMDIyIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQwOTBcIiBkYXRhLWVuZD1cIjQwOTZcIj4wLjE8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNDA5NlwiIGRhdGEtZW5kPVwiNDEwN1wiPjEuMTIyIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQxMDdcIiBkYXRhLWVuZD1cIjQxMTRcIj4xLjEwPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQxMTRcIiBkYXRhLWVuZD1cIjQxMjVcIj4wLjAyMiBtbTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI0MTI1XCIgZGF0YS1lbmQ9XCI0MTMyXCI+MC4wMjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI0MTMyXCIgZGF0YS1lbmQ9XCI0MTQzXCI+MS4xNSBtbTxcL3RkPlxuPFwvdHI+XG48dHIgZGF0YS1zdGFydD1cIjQxNDRcIiBkYXRhLWVuZD1cIjQyMDlcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiNDE0NFwiIGRhdGEtZW5kPVwiNDE1NVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjEuMDIyIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQxNTVcIiBkYXRhLWVuZD1cIjQxNjFcIj4wLjE8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNDE2MVwiIGRhdGEtZW5kPVwiNDE3MlwiPjEuMTIyIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQxNzJcIiBkYXRhLWVuZD1cIjQxNzlcIj4xLjEwPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjQxNzlcIiBkYXRhLWVuZD1cIjQxOTBcIj4wLjAyMiBtbTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI0MTkwXCIgZGF0YS1lbmQ9XCI0MTk4XCI+MC4wMjU8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNDE5OFwiIGRhdGEtZW5kPVwiNDIwOVwiPjEuMTAgbW08XC90ZD5cbjxcL3RyPlxuPFwvdGJvZHk+XG48XC90YWJsZT5cbjxcL2Rpdj5cbjxcL2Rpdj5cbjxociBkYXRhLXN0YXJ0PVwiNDIxMVwiIGRhdGEtZW5kPVwiNDIxNFwiIFwvPlxuPGgzIGRhdGEtc3RhcnQ9XCI0MjE2XCIgZGF0YS1lbmQ9XCI0MjY2XCI+UGVyc29uYWwgdmlldyBvbiBzZXR0aW5nIHRoZSBzdGVwLXVwIHRocmVzaG9sZDxcL2gzPlxuPHAgZGF0YS1zdGFydD1cIjQyNjdcIiBkYXRhLWVuZD1cIjQ1NzVcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCI0MjY3XCIgZGF0YS1lbmQ9XCI0Mjg1XCI+UHJvcyBhbmQgY29uczo8XC9zdHJvbmc+IEFmdGVyIGNvbXBlbnNhdGlvbiwgaWYgdGhlIGZpbmFsIGhvbGUgaXMgYSBsaXR0bGUgbGFyZ2VyLCBhdCBsZWFzdCB0aGUgcGFydCBjYW4gYmUgaW5zZXJ0ZWQuIElmIHRoZSBob2xlIGlzIHRvbyBzbWFsbCwgdGhlIHBhcnQgY2Fubm90IGJlIGluc2VydGVkLiBTbyB3ZSB1c3VhbGx5IHNldCB0aGUgc3RlcC11cCB0aHJlc2hvbGQgdG8gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNDQ3N1wiIGRhdGEtZW5kPVwiNDQ4NlwiPjIwIFx1MDBiNW08XC9zdHJvbmc+IGluc3RlYWQgb2YgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNDQ5OFwiIGRhdGEtZW5kPVwiNDUwN1wiPjI1IFx1MDBiNW08XC9zdHJvbmc+LiBUaGUgZXhhY3QgY2hvaWNlIHNob3VsZCBtYXRjaCBlYWNoIHByb2Nlc3MgYW5kIGNvbXBlbnNhdGlvbiB2YWx1ZS48XC9wPlxuPHAgZGF0YS1zdGFydD1cIjQ1NzdcIiBkYXRhLWVuZD1cIjQ4NjJcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCI0NTc3XCIgZGF0YS1lbmQ9XCI0NjE0XCI+Q29tYmluZWQgd2l0aCBjb21wZW5zYXRpb24gdmFsdWU6PFwvc3Ryb25nPiBGb3IgYm9hcmRzIHdpdGggSEFTTCB3aGVyZSBjb21wZW5zYXRpb24gaXMgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNDY1OFwiIGRhdGEtZW5kPVwiNDY2OVwiPjAuMTUgbW08XC9zdHJvbmc+LCB5b3UgYWxyZWFkeSBcdTIwMWNvdmVyLWNvbXBlbnNhdGVcdTIwMWQgYSBiaXQgYW5kIHRoZSBmaW5hbCBob2xlcyB0ZW5kIHRvIGJlIHNsaWdodGx5IGxhcmdlLiBJbiB0aGF0IGNhc2UsIGEgc3RlcC11cCB0aHJlc2hvbGQgb2YgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNDc5MVwiIGRhdGEtZW5kPVwiNDgwMFwiPjI1IFx1MDBiNW08XC9zdHJvbmc+IGNhbiBhbHNvIHdvcmsuIFVzZSB0aGUgXHUyMDFjbmVhcmVzdFx1MjAxZCBydWxlIHdoZW4gcGlja2luZyB0aGUgZHJpbGwuPFwvcD5cbjxociBkYXRhLXN0YXJ0PVwiNDg2NFwiIGRhdGEtZW5kPVwiNDg2N1wiIFwvPlxuPGgyIGRhdGEtc3RhcnQ9XCI0ODY5XCIgZGF0YS1lbmQ9XCI0OTQzXCI+My4gSG93IHRvIGVuc3VyZSBmaW5hbCBob2xlIHNpemUgbWVldHMgcmVxdWlyZW1lbnRzIGFmdGVyIGNvbXBlbnNhdGlvbj88XC9oMj5cbjxoMyBkYXRhLXN0YXJ0PVwiNDk0NVwiIGRhdGEtZW5kPVwiNDk4M1wiPk1ldGhvZCAxOiBCdXkgc3BlY2lhbCBkcmlsbCBiaXRzPFwvaDM+XG48cCBkYXRhLXN0YXJ0PVwiNDk4NFwiIGRhdGEtZW5kPVwiNTIwN1wiPlN0YW5kYXJkIGRyaWxsIGluY3JlbWVudCBpcyA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI1MDEyXCIgZGF0YS1lbmQ9XCI1MDIxXCI+NTAgXHUwMGI1bTxcL3N0cm9uZz4gKDAuMDUgbW0gc3RlcHMgbGlrZSAxLjAwLCAxLjA1LCAxLjEwLCAxLjE1IG1tKS4gV2l0aCBhIFBUSCB0b2xlcmFuY2Ugb2YgXHUwMGIxMyBtaWwsIGEgNTAgXHUwMGI1bSBkcmlsbCBzZXQgY2FuIGNvdmVyIHRoZSB0b2xlcmFuY2UuIElmIHRoZSB0b2xlcmFuY2UgaXMgc21hbGxlciB0aGFuIHRoYXQsIHVzZSBzcGVjaWFsIGRyaWxsIGJpdHMuPFwvcD5cbjxwIGRhdGEtc3RhcnQ9XCI1MjA5XCIgZGF0YS1lbmQ9XCI1MzUyXCI+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiNTIwOVwiIGRhdGEtZW5kPVwiNTIyMlwiPkV4YW1wbGUgMTxcL3N0cm9uZz4gXHUyMDE0IENvbXBhcmUgNTAgXHUwMGI1bSB2cyAyNSBcdTAwYjVtIGluY3JlbWVudHM6PGJyIGRhdGEtc3RhcnQ9XCI1MjU5XCIgZGF0YS1lbmQ9XCI1MjYyXCIgXC8+T3JpZ2luYWwgaG9sZSA9IDxzdHJvbmcgZGF0YS1zdGFydD1cIjUyNzhcIiBkYXRhLWVuZD1cIjUyOTBcIj4wLjkyMiBtbTxcL3N0cm9uZz4sIGNvbXBlbnNhdGlvbiA9IDxzdHJvbmcgZGF0YS1zdGFydD1cIjUzMDdcIiBkYXRhLWVuZD1cIjUzMThcIj4wLjEwIG1tPFwvc3Ryb25nPiwgY29tcGVuc2F0ZWQgc2l6ZSA9IDxzdHJvbmcgZGF0YS1zdGFydD1cIjUzMzlcIiBkYXRhLWVuZD1cIjUzNTFcIj4xLjAyMiBtbTxcL3N0cm9uZz4uPFwvcD5cbjxkaXYgY2xhc3M9XCJUeWFnR1dfdGFibGVDb250YWluZXJcIj5cbjxkaXYgY2xhc3M9XCJncm91cCBUeWFnR1dfdGFibGVXcmFwcGVyIGZsZXggdy1maXQgZmxleC1jb2wtcmV2ZXJzZVwiIHRhYmluZGV4PVwiLTFcIj5cbjx0YWJsZSBjbGFzcz1cInctZml0IG1pbi13LSgtLXRocmVhZC1jb250ZW50LXdpZHRoKVwiIGRhdGEtc3RhcnQ9XCI1MzU0XCIgZGF0YS1lbmQ9XCI1NTQ1XCI+XG48dGhlYWQgZGF0YS1zdGFydD1cIjUzNTRcIiBkYXRhLWVuZD1cIjU0MjJcIj5cbjx0ciBkYXRhLXN0YXJ0PVwiNTM1NFwiIGRhdGEtZW5kPVwiNTQyMlwiPlxuPHRoIGRhdGEtc3RhcnQ9XCI1MzU0XCIgZGF0YS1lbmQ9XCI1MzY1XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+T3JpZ2luYWw8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiNTM2NVwiIGRhdGEtZW5kPVwiNTM4MFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkNvbXBlbnNhdGlvbjxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI1MzgwXCIgZGF0YS1lbmQ9XCI1Mzk0XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+Q29tcGVuc2F0ZWQ8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiNTM5NFwiIGRhdGEtZW5kPVwiNTQwNlwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkluY3JlbWVudDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI1NDA2XCIgZGF0YS1lbmQ9XCI1NDIyXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+RHJpbGwgY2hvc2VuPFwvdGg+XG48XC90cj5cbjxcL3RoZWFkPlxuPHRib2R5IGRhdGEtc3RhcnQ9XCI1NDUwXCIgZGF0YS1lbmQ9XCI1NTQ1XCI+XG48dHIgZGF0YS1zdGFydD1cIjU0NTBcIiBkYXRhLWVuZD1cIjU0OTZcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiNTQ1MFwiIGRhdGEtZW5kPVwiNTQ1OFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjAuOTIyPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjU0NThcIiBkYXRhLWVuZD1cIjU0NjVcIj4wLjEwPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjU0NjVcIiBkYXRhLWVuZD1cIjU0NzNcIj4xLjAyMjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI1NDczXCIgZGF0YS1lbmQ9XCI1NDg4XCI+MC4wNSAoNTAgXHUwMGI1bSk8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNTQ4OFwiIGRhdGEtZW5kPVwiNTQ5NlwiPjEuMDU8XC90ZD5cbjxcL3RyPlxuPHRyIGRhdGEtc3RhcnQ9XCI1NDk3XCIgZGF0YS1lbmQ9XCI1NTQ1XCI+XG48dGQgZGF0YS1zdGFydD1cIjU0OTdcIiBkYXRhLWVuZD1cIjU1MDVcIiBkYXRhLWNvbC1zaXplPVwic21cIj4wLjkyMjxcL3RkPlxuPHRkIGRhdGEtc3RhcnQ9XCI1NTA1XCIgZGF0YS1lbmQ9XCI1NTEyXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+MC4xMDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI1NTEyXCIgZGF0YS1lbmQ9XCI1NTIwXCI+MS4wMjI8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNTUyMFwiIGRhdGEtZW5kPVwiNTUzNlwiPjAuMDI1ICgyNSBcdTAwYjVtKTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI1NTM2XCIgZGF0YS1lbmQ9XCI1NTQ1XCI+MS4wMjU8XC90ZD5cbjxcL3RyPlxuPFwvdGJvZHk+XG48XC90YWJsZT5cbjxcL2Rpdj5cbjxcL2Rpdj5cbjxwIGRhdGEtc3RhcnQ9XCI1NTQ3XCIgZGF0YS1lbmQ9XCI1Njg5XCI+RGlmZmVyZW5jZTogMS4wNTAgXHUyMjEyIDEuMDIyID0gMC4wMjggbW07IDEuMDI1IFx1MjIxMiAxLjAyMiA9IDAuMDAzIG1tLiBUaGUgc21hbGxlciBkaWZmZXJlbmNlIGlzIGJldHRlciwgc28gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNTY0OFwiIGRhdGEtZW5kPVwiNTY2MFwiPjEuMDI1IG1tPFwvc3Ryb25nPiAoMjUgXHUwMGI1bSBpbmNyZW1lbnQpIGlzIGJldHRlci48XC9wPlxuPHAgZGF0YS1zdGFydD1cIjU2OTFcIiBkYXRhLWVuZD1cIjU4MThcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCI1NjkxXCIgZGF0YS1lbmQ9XCI1NzA0XCI+RXhhbXBsZSAyPFwvc3Ryb25nPiBcdTIwMTQgNTAgXHUwMGI1bSB2cyBzcGVjaWFsIGRyaWxsOjxiciBkYXRhLXN0YXJ0PVwiNTczMFwiIGRhdGEtZW5kPVwiNTczM1wiIFwvPk9yaWdpbmFsIGhvbGUgPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI1NzQ5XCIgZGF0YS1lbmQ9XCI1NzYxXCI+MC42MTEgbW08XC9zdHJvbmc+LCBjb21wZW5zYXRpb24gPSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI1Nzc4XCIgZGF0YS1lbmQ9XCI1Nzg5XCI+MC4xMCBtbTxcL3N0cm9uZz4sIGNvbXBlbnNhdGVkID0gPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNTgwNVwiIGRhdGEtZW5kPVwiNTgxN1wiPjAuNzExIG1tPFwvc3Ryb25nPi48XC9wPlxuPGRpdiBjbGFzcz1cIlR5YWdHV190YWJsZUNvbnRhaW5lclwiPlxuPGRpdiBjbGFzcz1cImdyb3VwIFR5YWdHV190YWJsZVdyYXBwZXIgZmxleCB3LWZpdCBmbGV4LWNvbC1yZXZlcnNlXCIgdGFiaW5kZXg9XCItMVwiPlxuPHRhYmxlIGNsYXNzPVwidy1maXQgbWluLXctKC0tdGhyZWFkLWNvbnRlbnQtd2lkdGgpXCIgZGF0YS1zdGFydD1cIjU4MjBcIiBkYXRhLWVuZD1cIjYwMThcIj5cbjx0aGVhZCBkYXRhLXN0YXJ0PVwiNTgyMFwiIGRhdGEtZW5kPVwiNTg5NVwiPlxuPHRyIGRhdGEtc3RhcnQ9XCI1ODIwXCIgZGF0YS1lbmQ9XCI1ODk1XCI+XG48dGggZGF0YS1zdGFydD1cIjU4MjBcIiBkYXRhLWVuZD1cIjU4MzFcIiBkYXRhLWNvbC1zaXplPVwic21cIj5PcmlnaW5hbDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI1ODMxXCIgZGF0YS1lbmQ9XCI1ODQ2XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+Q29tcGVuc2F0aW9uPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjU4NDZcIiBkYXRhLWVuZD1cIjU4NjBcIiBkYXRhLWNvbC1zaXplPVwic21cIj5Db21wZW5zYXRlZDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI1ODYwXCIgZGF0YS1lbmQ9XCI1ODc5XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+SW5jcmVtZW50IFwvIFR5cGU8XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiNTg3OVwiIGRhdGEtZW5kPVwiNTg5NVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkRyaWxsIGNob3NlbjxcL3RoPlxuPFwvdHI+XG48XC90aGVhZD5cbjx0Ym9keSBkYXRhLXN0YXJ0PVwiNTkyM1wiIGRhdGEtZW5kPVwiNjAxOFwiPlxuPHRyIGRhdGEtc3RhcnQ9XCI1OTIzXCIgZGF0YS1lbmQ9XCI1OTY5XCI+XG48dGQgZGF0YS1zdGFydD1cIjU5MjNcIiBkYXRhLWVuZD1cIjU5MzFcIiBkYXRhLWNvbC1zaXplPVwic21cIj4wLjYxMTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI1OTMxXCIgZGF0YS1lbmQ9XCI1OTM4XCI+MC4xMDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI1OTM4XCIgZGF0YS1lbmQ9XCI1OTQ2XCI+MC43MTE8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNTk0NlwiIGRhdGEtZW5kPVwiNTk2MVwiPjAuMDUgKDUwIFx1MDBiNW0pPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjU5NjFcIiBkYXRhLWVuZD1cIjU5NjlcIj4wLjcwPFwvdGQ+XG48XC90cj5cbjx0ciBkYXRhLXN0YXJ0PVwiNTk3MFwiIGRhdGEtZW5kPVwiNjAxOFwiPlxuPHRkIGRhdGEtc3RhcnQ9XCI1OTcwXCIgZGF0YS1lbmQ9XCI1OTc4XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+MC42MTE8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNTk3OFwiIGRhdGEtZW5kPVwiNTk4NVwiPjAuMTA8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiNTk4NVwiIGRhdGEtZW5kPVwiNTk5M1wiPjAuNzExPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjU5OTNcIiBkYXRhLWVuZD1cIjYwMDlcIj5TcGVjaWFsIGRyaWxsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjYwMDlcIiBkYXRhLWVuZD1cIjYwMThcIj4wLjcxMTxcL3RkPlxuPFwvdHI+XG48XC90Ym9keT5cbjxcL3RhYmxlPlxuPFwvZGl2PlxuPFwvZGl2PlxuPHAgZGF0YS1zdGFydD1cIjYwMjBcIiBkYXRhLWVuZD1cIjYxNjFcIj5EaWZmZXJlbmNlOiAwLjcwMCBcdTIyMTIgMC43MTEgPSBcdTIyMTIwLjAxMSBtbTsgMC43MTEgXHUyMjEyIDAuNzExID0gMC4wMDAgbW0uIFRoZSBzbWFsbGVyIGRpZmZlcmVuY2UgaXMgYmV0dGVyLiBTbyB0aGUgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiNjEyNlwiIGRhdGEtZW5kPVwiNjE1MlwiPjAuNzExIG1tIHNwZWNpYWwgZHJpbGw8XC9zdHJvbmc+IGlzIGJlc3QuPFwvcD5cbjxoMyBkYXRhLXN0YXJ0PVwiNjE2M1wiIGRhdGEtZW5kPVwiNjIwNlwiPk1ldGhvZCAyOiBJbXByb3ZlIHByb2Nlc3MgYW5kIGVxdWlwbWVudDxcL2gzPlxuPHVsIGRhdGEtc3RhcnQ9XCI2MjA3XCIgZGF0YS1lbmQ9XCI2NzUyXCI+XG48bGkgZGF0YS1zdGFydD1cIjYyMDdcIiBkYXRhLWVuZD1cIjYyOTZcIj5cbjxwIGRhdGEtc3RhcnQ9XCI2MjA5XCIgZGF0YS1lbmQ9XCI2Mjk2XCI+QWRkIGEgc2Vjb25kIGJvYXJkIHBsYXRpbmcgc3RlcCB0byByZWR1Y2UgdW5ldmVuIHRoaWNrbmVzcyBmcm9tIHBhdHRlcm4gZGlzdHJpYnV0aW9uLjxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiNjI5N1wiIGRhdGEtZW5kPVwiNjM5NVwiPlxuPHAgZGF0YS1zdGFydD1cIjYyOTlcIiBkYXRhLWVuZD1cIjYzOTVcIj5Vc2UgbmVnYXRpdmUgcGhvdG8gZGlyZWN0LWV0Y2hpbmcgYW5kIHBsYXRlIHRoZSB3aG9sZSBib2FyZCB0byByZWR1Y2UgdW5ldmVuIGNvcHBlciB0aGlja25lc3MuPFwvcD5cbjxcL2xpPlxuPGxpIGRhdGEtc3RhcnQ9XCI2Mzk2XCIgZGF0YS1lbmQ9XCI2NTM4XCI+XG48cCBkYXRhLXN0YXJ0PVwiNjM5OFwiIGRhdGEtZW5kPVwiNjUzOFwiPkxvd2VyIHRoZSBjdXJyZW50IGRlbnNpdHkgKHR5cGljYWwgaXMgMTkgQVNGKTsgc2xpZ2h0bHkgbG93ZXIgY3VycmVudCBkZW5zaXR5IGNhbiBpbXByb3ZlIHBsYXRpbmcgdW5pZm9ybWl0eSBidXQgd2lsbCBleHRlbmQgcGxhdGluZyB0aW1lLjxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiNjUzOVwiIGRhdGEtZW5kPVwiNjc1MlwiPlxuPHAgZGF0YS1zdGFydD1cIjY1NDFcIiBkYXRhLWVuZD1cIjY3NTJcIj5VcGdyYWRlIHRvIGEgaG9yaXpvbnRhbCBwbGF0aW5nIGxpbmUuIFZlcnRpY2FsIHBsYXRpbmcgbGluZXMgb2Z0ZW4gZ2l2ZSB0aGlja2VyIGNvcHBlciBhdCB0aGUgaG9sZSBlZGdlIGFuZCB0aGlubmVyIGNvcHBlciBhdCB0aGUgaG9sZSBjZW50ZXIgZm9yIGhpZ2ggYXNwZWN0LXJhdGlvIGhvbGVzLiBBIGhvcml6b250YWwgbGluZSBjYW4gcmVkdWNlIHRoYXQgaXNzdWUuPFwvcD5cbjxcL2xpPlxuPFwvdWw+XG48aDMgZGF0YS1zdGFydD1cIjY3NTRcIiBkYXRhLWVuZD1cIjY3OTBcIj5NZXRob2QgMzogSW1wcm92ZSBDQU0gc3RyYXRlZ2llczxcL2gzPlxuPHVsIGRhdGEtc3RhcnQ9XCI2NzkxXCIgZGF0YS1lbmQ9XCI3ODg1XCI+XG48bGkgZGF0YS1zdGFydD1cIjY3OTFcIiBkYXRhLWVuZD1cIjcwMTlcIj5cbjxwIGRhdGEtc3RhcnQ9XCI2NzkzXCIgZGF0YS1lbmQ9XCI3MDE5XCI+Rm9yIGhvbGVzIGluIGlzb2xhdGVkIGNvcHBlciBhcmVhcywgYXBwbHkgb25lIGV4dHJhIGluY3JlbWVudCBjb21wZW5zYXRpb24uIElzb2xhdGVkIGFyZWFzIGhhdmUgbGVzcyBjb3BwZXIsIHNvIGR1cmluZyBwbGF0aW5nIHRoZXkgZ2V0IGhpZ2hlciBsb2NhbCBjdXJyZW50IGRlbnNpdHkgYW5kIG1vcmUgY29wcGVyIHRoaWNrbmVzczsgZXh0cmEgY29tcGVuc2F0aW9uIG9mZnNldHMgdGhhdC48XC9wPlxuPFwvbGk+XG48bGkgZGF0YS1zdGFydD1cIjcwMjBcIiBkYXRhLWVuZD1cIjczNjFcIj5cbjxwIGRhdGEtc3RhcnQ9XCI3MDIyXCIgZGF0YS1lbmQ9XCI3MzYxXCI+Rm9yIGRlc2lnbnMgd2l0aCBkZW5zZSB0cmFjZXMgb24gb25lIHNpZGUgYW5kIHNwYXJzZSBvbiB0aGUgb3RoZXIgKGZvciBleGFtcGxlLCBhIHBvd2VyIGJvYXJkKSwgcGxhY2UgdGhlIHNwYXJzZSBzaWRlIGlud2FyZCBhbmQgdGhlIGRlbnNlIHNpZGUgb3V0d2FyZCwgYW5kIHVzZSByZXZlcnNlZCBwYW5lbGl6YXRpb24uIER1cmluZyBwYW5lbCBwbGF0aW5nLCBhcmVhcyBuZWFyIHRoZSBib2FyZCBlZGdlIGdldCBoaWdoZXIgY3VycmVudCBkZW5zaXR5IGFuZCB0aGlja2VyIHBsYXRpbmcuIFJldmVyc2VkIHBhbmVsaXphdGlvbiBoZWxwcyBiYWxhbmNlIHBsYXRpbmcgZGlzdHJpYnV0aW9uLjxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiNzM2MlwiIGRhdGEtZW5kPVwiNzYxN1wiPlxuPHAgZGF0YS1zdGFydD1cIjczNjRcIiBkYXRhLWVuZD1cIjc2MTdcIj5XaGVuIFRPUCBhbmQgQk9UVE9NIGNvcHBlciBhcmVhIGRpZmZlciBhIGxvdCwgdXNlIHBvc2l0aXZlXC9uZWdhdGl2ZSAoeWluLXlhbmcpIHBhbmVsaW5nLiBVbmV2ZW4gY29wcGVyIGFyZWEgY2F1c2VzIFx1MjAxY2JlbGwtbW91dGhcdTIwMWQgdmlhczsgdGhlIHRoaWNrZXIgdGhlIGJvYXJkIGFuZCB0aGUgbW9yZSBjb3BwZXIsIHRoZSB3b3JzZSB0aGUgZWZmZWN0OyB5aW4teWFuZyBwYW5lbGluZyBoZWxwcyBiYWxhbmNlIGNvcHBlciBkaXN0cmlidXRpb24uPFwvcD5cbjxcL2xpPlxuPGxpIGRhdGEtc3RhcnQ9XCI3NjE4XCIgZGF0YS1lbmQ9XCI3ODg1XCI+XG48cCBkYXRhLXN0YXJ0PVwiNzYyMFwiIGRhdGEtZW5kPVwiNzg4NVwiPkZvciBpc29sYXRlZC1hcmVhIGhvbGVzIG5lYXIgdGhlIGJvYXJkIGVkZ2Ugb3Igc2xvdHMsIGFkZCBjb3BwZXIgXHUyMDFjcGljay11cFx1MjAxZCBhcmVhcyBvciBjb3BwZXIgcGFkcyBuZWFyIHRoZSBlZGdlIG9yIHNsb3QuIElzb2xhdGVkIGhvbGVzIGNhbiBnZXQgdG9vIG11Y2ggcGxhdGluZyB0aGlja25lc3MgYW5kIGJlY29tZSB0b28gc21hbGw7IGV4dHJhIGNvcHBlciBuZWFyIHRoZW0gcmVkdWNlcyBsb2NhbCBjdXJyZW50IGRlbnNpdHkgYW5kIGJhbGFuY2VzIHBsYXRpbmcuPFwvcD5cbjxcL2xpPlxuPFwvdWw+XG48aHIgZGF0YS1zdGFydD1cIjc4ODdcIiBkYXRhLWVuZD1cIjc4OTBcIiBcLz5cbjxoMiBkYXRhLXN0YXJ0PVwiNzg5MlwiIGRhdGEtZW5kPVwiNzk1MlwiPjQuIEhvdyBtdWNoIGNvbXBlbnNhdGlvbiBpcyBuZWVkZWQgYW5kIGhvdyBpcyBpdCBkZXJpdmVkPzxcL2gyPlxuPHAgZGF0YS1zdGFydD1cIjc5NTRcIiBkYXRhLWVuZD1cIjgwODdcIj5Db21wZW5zYXRpb24gdmFsdWVzIGNvbWUgZnJvbSBwcm9jZXNzIHRlc3RzLiBCZWxvdyBpcyBvbmUgc2V0IG9mIG1lYXN1cmVkIGhvbGUgc2l6ZSBjaGFuZ2VzIGFmdGVyIHZhcmlvdXMgc3RlcHMgKGRhdGEgZnJvbSBhIHJlcG9ydCk6PFwvcD5cbjxwIGRhdGEtc3RhcnQ9XCI4MDg5XCIgZGF0YS1lbmQ9XCI4MjEyXCI+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiODA4OVwiIGRhdGEtZW5kPVwiODEwNlwiPlByb2Nlc3MgZmxvdzo8XC9zdHJvbmc+IG1lY2hhbmljYWwgZHJpbGxpbmcgXHUyMTkyIGltbWVyc2lvbiBjb3BwZXIgXHUyMTkyIGVsZWN0cm9wbGF0aW5nIFx1MjE5MiBwYXR0ZXJuIHRyYW5zZmVyIFx1MjE5MiBldGNoIFx1MjE5MiBBT0kgXHUyMTkyIHdldCBmaWxtIFx1MjE5MiBIQVNMPFwvcD5cbjxwIGRhdGEtc3RhcnQ9XCI4MjE0XCIgZGF0YS1lbmQ9XCI4MjM5XCI+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiODIxNFwiIGRhdGEtZW5kPVwiODIzN1wiPlByb2Nlc3MgcGFyYW1ldGVyczo8XC9zdHJvbmc+PFwvcD5cbjx1bCBkYXRhLXN0YXJ0PVwiODI0MFwiIGRhdGEtZW5kPVwiODUxNVwiPlxuPGxpIGRhdGEtc3RhcnQ9XCI4MjQwXCIgZGF0YS1lbmQ9XCI4MzMwXCI+XG48cCBkYXRhLXN0YXJ0PVwiODI0MlwiIGRhdGEtZW5kPVwiODMzMFwiPkRyaWxsOiBkcmlsbCBiaXQgc2l6ZSAwLjk1IG1tLCByZS1zaGFycGVuXC9yZWdyaW5kIDMgdGltZXMsIGRyaWxsIGNvbXBlbnNhdGlvbiAwLjE1IG1tOzxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiODMzMVwiIGRhdGEtZW5kPVwiODM4NlwiPlxuPHAgZGF0YS1zdGFydD1cIjgzMzNcIiBkYXRhLWVuZD1cIjgzODZcIj5QbGF0aW5nOiBjb3BwZXIgdGhpY2tuZXNzIFx1MjI2NSAxOCBcdTAwYjVtLCBhdmVyYWdlIFx1MjI2NSAyMCBcdTAwYjVtOzxcL3A+XG48XC9saT5cbjxsaSBkYXRhLXN0YXJ0PVwiODM4N1wiIGRhdGEtZW5kPVwiODQ1NlwiPlxuPHAgZGF0YS1zdGFydD1cIjgzODlcIiBkYXRhLWVuZD1cIjg0NTZcIj5IQVNMOiBmaW5hbCBob2xlIHJlcXVpcmVtZW50IDAuODAgbW0sIHRvbGVyYW5jZSBcdTAwYjEwLjA4IG1tICgzIG1pbCk7PFwvcD5cbjxcL2xpPlxuPGxpIGRhdGEtc3RhcnQ9XCI4NDU3XCIgZGF0YS1lbmQ9XCI4NTE1XCI+XG48cCBkYXRhLXN0YXJ0PVwiODQ1OVwiIGRhdGEtZW5kPVwiODUxNVwiPlRlc3Q6IDEwIHBhbmVscywgY29ybmVyIHRyaW1tZWQsIGJvYXJkIHRoaWNrbmVzcyAyLjAgbW0uPFwvcD5cbjxcL2xpPlxuPFwvdWw+XG48aDMgZGF0YS1zdGFydD1cIjg1MTdcIiBkYXRhLWVuZD1cIjg1NDZcIj5Ib2xlIHNpemUgY2hhbmdlcyBieSBzdGVwPFwvaDM+XG48cCBkYXRhLXN0YXJ0PVwiODU0OFwiIGRhdGEtZW5kPVwiODU5M1wiPjxzdHJvbmcgZGF0YS1zdGFydD1cIjg1NDhcIiBkYXRhLWVuZD1cIjg1NjlcIj4xKSBBZnRlciBkcmlsbGluZzxcL3N0cm9uZz4gXHUyMDE0IGhvbGUgc2l6ZXMgbWVhc3VyZWQ8XC9wPlxuPHVsIGRhdGEtc3RhcnQ9XCI4NTk0XCIgZGF0YS1lbmQ9XCI4Nzk1XCI+XG48bGkgZGF0YS1zdGFydD1cIjg1OTRcIiBkYXRhLWVuZD1cIjg3OTVcIj5cbjxwIGRhdGEtc3RhcnQ9XCI4NTk2XCIgZGF0YS1lbmQ9XCI4Nzk1XCI+VG90YWwgMTkyMCBob2xlcyB0ZXN0ZWQgKDEwIHBhbmVscywgMzg0IGhvbGVzIGVhY2gpLiBTYW1wbGU6IDIwMCBob2xlcyAoMjAgcGVyIHBhbmVsKS4gSG9sZSByYW5nZTogPHN0cm9uZyBkYXRhLXN0YXJ0PVwiODY5NVwiIGRhdGEtZW5kPVwiODcxMVwiPjAuOTNcdTIwMTMwLjk0IG1tPFwvc3Ryb25nPiwgYXZlcmFnZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI4NzIxXCIgZGF0YS1lbmQ9XCI4NzMzXCI+MC45MzEgbW08XC9zdHJvbmc+LjxiciBkYXRhLXN0YXJ0PVwiODczNFwiIGRhdGEtZW5kPVwiODczN1wiIFwvPihUaGVuIGEgbG9uZyBsaXN0IG9mIHNhbXBsZWQgdmFsdWVzLCBtb3N0bHkgMC45MyBvciAwLjk0Lik8XC9wPlxuPFwvbGk+XG48XC91bD5cbjxwIGRhdGEtc3RhcnQ9XCI4Nzk3XCIgZGF0YS1lbmQ9XCI4ODQ4XCI+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiODc5N1wiIGRhdGEtZW5kPVwiODg0NlwiPjIpIEFmdGVyIHBhdHRlcm5lZCBwbGF0aW5nIFx1MjAxNCBjb3BwZXIgdGhpY2tuZXNzPFwvc3Ryb25nPjxcL3A+XG48dWwgZGF0YS1zdGFydD1cIjg4NDlcIiBkYXRhLWVuZD1cIjg5OTlcIj5cbjxsaSBkYXRhLXN0YXJ0PVwiODg0OVwiIGRhdGEtZW5kPVwiODk5OVwiPlxuPHAgZGF0YS1zdGFydD1cIjg4NTFcIiBkYXRhLWVuZD1cIjg5OTlcIj5Gb3IgZWFjaCBwYW5lbCwgdGVzdCAxMCBob2xlcy4gQ29wcGVyIHRoaWNrbmVzcyByYW5nZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI4OTA1XCIgZGF0YS1lbmQ9XCI4OTE3XCI+MThcdTIwMTMzMSBcdTAwYjVtPFwvc3Ryb25nPiwgbWVldGluZyBcdTIyNjUxOCBcdTAwYjVtIGFuZCBhdmVyYWdlIFx1MjI2NTIwIFx1MDBiNW0uPGJyIGRhdGEtc3RhcnQ9XCI4OTUzXCIgZGF0YS1lbmQ9XCI4OTU2XCIgXC8+KFRoZW4gbWFueSBzYW1wbGUgY29wcGVyIHRoaWNrbmVzcyB2YWx1ZXMuKTxcL3A+XG48XC9saT5cbjxcL3VsPlxuPHAgZGF0YS1zdGFydD1cIjkwMDFcIiBkYXRhLWVuZD1cIjkwNDVcIj48c3Ryb25nIGRhdGEtc3RhcnQ9XCI5MDAxXCIgZGF0YS1lbmQ9XCI5MDQzXCI+MykgQWZ0ZXIgcGF0dGVybmVkIHBsYXRpbmcgXHUyMDE0IGhvbGUgc2l6ZTxcL3N0cm9uZz48XC9wPlxuPHVsIGRhdGEtc3RhcnQ9XCI5MDQ2XCIgZGF0YS1lbmQ9XCI5MTc2XCI+XG48bGkgZGF0YS1zdGFydD1cIjkwNDZcIiBkYXRhLWVuZD1cIjkxNzZcIj5cbjxwIGRhdGEtc3RhcnQ9XCI5MDQ4XCIgZGF0YS1lbmQ9XCI5MTc2XCI+VG90YWwgMTkyMCBob2xlcywgc2FtcGxlIDIwMC4gSG9sZSByYW5nZTogPHN0cm9uZyBkYXRhLXN0YXJ0PVwiOTA5MFwiIGRhdGEtZW5kPVwiOTEwNlwiPjAuODRcdTIwMTMwLjg4IG1tPFwvc3Ryb25nPiwgYXZlcmFnZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI5MTE2XCIgZGF0YS1lbmQ9XCI5MTI4XCI+MC44NTggbW08XC9zdHJvbmc+LjxiciBkYXRhLXN0YXJ0PVwiOTEyOVwiIGRhdGEtZW5kPVwiOTEzMlwiIFwvPihUaGVuIG1hbnkgc2FtcGxlIHZhbHVlcywgbW9zdGx5IDAuODVcdTIwMTMwLjg4Lik8XC9wPlxuPFwvbGk+XG48XC91bD5cbjxwIGRhdGEtc3RhcnQ9XCI5MTc4XCIgZGF0YS1lbmQ9XCI5MjA5XCI+PHN0cm9uZyBkYXRhLXN0YXJ0PVwiOTE3OFwiIGRhdGEtZW5kPVwiOTE5NVwiPjQpIEFmdGVyIEhBU0w8XC9zdHJvbmc+IFx1MjAxNCBob2xlIHNpemU8XC9wPlxuPHVsIGRhdGEtc3RhcnQ9XCI5MjEwXCIgZGF0YS1lbmQ9XCI5MzIyXCI+XG48bGkgZGF0YS1zdGFydD1cIjkyMTBcIiBkYXRhLWVuZD1cIjkzMjJcIj5cbjxwIGRhdGEtc3RhcnQ9XCI5MjEyXCIgZGF0YS1lbmQ9XCI5MzIyXCI+VG90YWwgMTkyMCBob2xlcywgc2FtcGxlIDIwMC4gSG9sZSByYW5nZTogPHN0cm9uZyBkYXRhLXN0YXJ0PVwiOTI1NFwiIGRhdGEtZW5kPVwiOTI3MFwiPjAuODJcdTIwMTMwLjg2IG1tPFwvc3Ryb25nPiwgYXZlcmFnZSA8c3Ryb25nIGRhdGEtc3RhcnQ9XCI5MjgwXCIgZGF0YS1lbmQ9XCI5MjkyXCI+MC44MzYgbW08XC9zdHJvbmc+LjxiciBkYXRhLXN0YXJ0PVwiOTI5M1wiIGRhdGEtZW5kPVwiOTI5NlwiIFwvPihUaGVuIG1hbnkgc2FtcGxlIHZhbHVlcy4pPFwvcD5cbjxcL2xpPlxuPFwvdWw+XG48cCBkYXRhLXN0YXJ0PVwiOTMyNFwiIGRhdGEtZW5kPVwiOTM0MFwiPjxzdHJvbmcgZGF0YS1zdGFydD1cIjkzMjRcIiBkYXRhLWVuZD1cIjkzNDBcIj5UZXN0IHN1bW1hcnk8XC9zdHJvbmc+PFwvcD5cbjxkaXYgY2xhc3M9XCJUeWFnR1dfdGFibGVDb250YWluZXJcIj5cbjxkaXYgY2xhc3M9XCJncm91cCBUeWFnR1dfdGFibGVXcmFwcGVyIGZsZXggdy1maXQgZmxleC1jb2wtcmV2ZXJzZVwiIHRhYmluZGV4PVwiLTFcIj5cbjx0YWJsZSBjbGFzcz1cInctZml0IG1pbi13LSgtLXRocmVhZC1jb250ZW50LXdpZHRoKVwiIGRhdGEtc3RhcnQ9XCI5MzQyXCIgZGF0YS1lbmQ9XCI5NTMxXCI+XG48dGhlYWQgZGF0YS1zdGFydD1cIjkzNDJcIiBkYXRhLWVuZD1cIjkzNzhcIj5cbjx0ciBkYXRhLXN0YXJ0PVwiOTM0MlwiIGRhdGEtZW5kPVwiOTM3OFwiPlxuPHRoIGRhdGEtc3RhcnQ9XCI5MzQyXCIgZGF0YS1lbmQ9XCI5MzQ5XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+U3RlcDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI5MzQ5XCIgZGF0YS1lbmQ9XCI5MzYyXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+SG9sZSByYW5nZTxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI5MzYyXCIgZGF0YS1lbmQ9XCI5Mzc4XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+QXZlcmFnZSBob2xlPFwvdGg+XG48XC90cj5cbjxcL3RoZWFkPlxuPHRib2R5IGRhdGEtc3RhcnQ9XCI5Mzk1XCIgZGF0YS1lbmQ9XCI5NTMxXCI+XG48dHIgZGF0YS1zdGFydD1cIjkzOTVcIiBkYXRhLWVuZD1cIjk0MzlcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiOTM5NVwiIGRhdGEtZW5kPVwiOTQxMlwiIGRhdGEtY29sLXNpemU9XCJzbVwiPkFmdGVyIGRyaWxsaW5nPFwvdGQ+XG48dGQgZGF0YS1zdGFydD1cIjk0MTJcIiBkYXRhLWVuZD1cIjk0MjdcIiBkYXRhLWNvbC1zaXplPVwic21cIj4wLjkzXHUyMDEzMC45NCBtbTxcL3RkPlxuPHRkIGRhdGEtc3RhcnQ9XCI5NDI3XCIgZGF0YS1lbmQ9XCI5NDM5XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+MC45MzEgbW08XC90ZD5cbjxcL3RyPlxuPHRyIGRhdGEtc3RhcnQ9XCI5NDQwXCIgZGF0YS1lbmQ9XCI5NDkwXCI+XG48dGQgZGF0YS1zdGFydD1cIjk0NDBcIiBkYXRhLWVuZD1cIjk0NjNcIiBkYXRhLWNvbC1zaXplPVwic21cIj5BZnRlciBjb3BwZXIgcGxhdGluZzxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI5NDYzXCIgZGF0YS1lbmQ9XCI5NDc4XCI+MC44NFx1MjAxMzAuODggbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiOTQ3OFwiIGRhdGEtZW5kPVwiOTQ5MFwiPjAuODU4IG1tPFwvdGQ+XG48XC90cj5cbjx0ciBkYXRhLXN0YXJ0PVwiOTQ5MVwiIGRhdGEtZW5kPVwiOTUzMVwiPlxuPHRkIGRhdGEtc3RhcnQ9XCI5NDkxXCIgZGF0YS1lbmQ9XCI5NTA0XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+QWZ0ZXIgSEFTTDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCI5NTA0XCIgZGF0YS1lbmQ9XCI5NTE5XCI+MC44Mlx1MjAxMzAuODYgbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiOTUxOVwiIGRhdGEtZW5kPVwiOTUzMVwiPjAuODM2IG1tPFwvdGQ+XG48XC90cj5cbjxcL3Rib2R5PlxuPFwvdGFibGU+XG48XC9kaXY+XG48XC9kaXY+XG48cCBkYXRhLXN0YXJ0PVwiOTUzM1wiIGRhdGEtZW5kPVwiOTcyM1wiPjxzdHJvbmcgZGF0YS1zdGFydD1cIjk1MzNcIiBkYXRhLWVuZD1cIjk1NDhcIj5Db25jbHVzaW9uOjxcL3N0cm9uZz4gRm9yIEhBU0wgYm9hcmRzIHRoZSBkcmlsbCBjb21wZW5zYXRpb24gb2YgPHN0cm9uZyBkYXRhLXN0YXJ0PVwiOTU5MVwiIGRhdGEtZW5kPVwiOTYwMlwiPjAuMTUgbW08XC9zdHJvbmc+IGlzIGFuIFx1MjAxY292ZXItY29tcGVuc2F0aW9uXHUyMDFkIGFuZCBjYXVzZXMgZmluYWwgaG9sZXMgdG8gYmUgbGFyZ2VyLiBUaGUgYmVzdCBjb21wZW5zYXRpb24gdmFsdWUgaW4gdGhpcyB0ZXN0IGlzIDxzdHJvbmcgZGF0YS1zdGFydD1cIjk3MTBcIiBkYXRhLWVuZD1cIjk3MjJcIj4wLjEyNSBtbTxcL3N0cm9uZz4uPFwvcD5cbjxociBkYXRhLXN0YXJ0PVwiOTcyNVwiIGRhdGEtZW5kPVwiOTcyOFwiIFwvPlxuPGgyPjUuIERyaWxsIGNvbXBlbnNhdGlvbiBjb2RlIGltcGxlbWVudGF0aW9uIChydWxlcyk8XC9oMj5cbjxvbCBkYXRhLXN0YXJ0PVwiOTc4NFwiIGRhdGEtZW5kPVwiOTgxN1wiPlxuPGxpIGRhdGEtc3RhcnQ9XCI5Nzg0XCIgZGF0YS1lbmQ9XCI5ODE3XCI+XG48cCBkYXRhLXN0YXJ0PVwiOTc4N1wiIGRhdGEtZW5kPVwiOTgxN1wiPkNvbXBlbnNhdGlvbiBhbmQgc3RlcC11cCBydWxlczxcL3A+XG48XC9saT5cbjxcL29sPlxuPGRpdiBjbGFzcz1cIlR5YWdHV190YWJsZUNvbnRhaW5lclwiPlxuPGRpdiBjbGFzcz1cImdyb3VwIFR5YWdHV190YWJsZVdyYXBwZXIgZmxleCB3LWZpdCBmbGV4LWNvbC1yZXZlcnNlXCIgdGFiaW5kZXg9XCItMVwiPlxuPHRhYmxlIGNsYXNzPVwidy1maXQgbWluLXctKC0tdGhyZWFkLWNvbnRlbnQtd2lkdGgpXCIgZGF0YS1zdGFydD1cIjk4MTlcIiBkYXRhLWVuZD1cIjEwODQzXCI+XG48dGhlYWQgZGF0YS1zdGFydD1cIjk4MTlcIiBkYXRhLWVuZD1cIjk5NjhcIj5cbjx0ciBkYXRhLXN0YXJ0PVwiOTgxOVwiIGRhdGEtZW5kPVwiOTk2OFwiPlxuPHRoIGRhdGEtc3RhcnQ9XCI5ODE5XCIgZGF0YS1lbmQ9XCI5ODI4XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+QXNwZWN0PFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjk4MjhcIiBkYXRhLWVuZD1cIjk4NDRcIiBkYXRhLWNvbC1zaXplPVwic21cIj5GaW5pc2hlZCBob2xlPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjk4NDRcIiBkYXRhLWVuZD1cIjk4NjFcIiBkYXRhLWNvbC1zaXplPVwic21cIj5TdXJmYWNlIGZpbmlzaDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI5ODYxXCIgZGF0YS1lbmQ9XCI5ODc5XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+Qm9hcmQgdGhpY2tuZXNzPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjk4NzlcIiBkYXRhLWVuZD1cIjk4OTlcIiBkYXRhLWNvbC1zaXplPVwic21cIj5TdGVwLXVwIHRocmVzaG9sZDxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI5ODk5XCIgZGF0YS1lbmQ9XCI5OTIzXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+SWYgdmlhIGNvcHBlciAmbHQ7IDI2IFx1MDBiNW08XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiOTkyM1wiIGRhdGEtZW5kPVwiOTkzNFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjI2XHUyMDEzMzcgXHUwMGI1bTxcL3RoPlxuPHRoIGRhdGEtc3RhcnQ9XCI5OTM0XCIgZGF0YS1lbmQ9XCI5OTQ1XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+MzdcdTIwMTM0NyBcdTAwYjVtPFwvdGg+XG48dGggZGF0YS1zdGFydD1cIjk5NDVcIiBkYXRhLWVuZD1cIjk5NTZcIiBkYXRhLWNvbC1zaXplPVwic21cIj40N1x1MjAxMzY3IFx1MDBiNW08XC90aD5cbjx0aCBkYXRhLXN0YXJ0PVwiOTk1NlwiIGRhdGEtZW5kPVwiOTk2OFwiIGRhdGEtY29sLXNpemU9XCJzbVwiPjY3XHUyMDEzODYgXHUwMGI1bTxcL3RoPlxuPFwvdHI+XG48XC90aGVhZD5cbjx0Ym9keSBkYXRhLXN0YXJ0PVwiMTAwMThcIiBkYXRhLWVuZD1cIjEwODQzXCI+XG48dHIgZGF0YS1zdGFydD1cIjEwMDE4XCIgZGF0YS1lbmQ9XCIxMDE0NlwiPlxuPHRkIGRhdGEtc3RhcnQ9XCIxMDAxOFwiIGRhdGEtZW5kPVwiMTAwNDNcIiBkYXRhLWNvbC1zaXplPVwic21cIj50aGlja25lc3MgcmF0aW8gJmx0OyAxMjoxPFwvdGQ+XG48dGQgZGF0YS1zdGFydD1cIjEwMDQzXCIgZGF0YS1lbmQ9XCIxMDA1NVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPlx1MjI2NCAxLjkwIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMDU1XCIgZGF0YS1lbmQ9XCIxMDA4NFwiPkhBU0wgKGxlYWRlZCBvciBsZWFkLWZyZWUpPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMDg0XCIgZGF0YS1lbmQ9XCIxMDA5NVwiPlx1MjI2NSAzLjUgbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAwOTVcIiBkYXRhLWVuZD1cIjEwMTA1XCI+MC4wMTk1MjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDEwNVwiIGRhdGEtZW5kPVwiMTAxMTNcIj41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDExM1wiIGRhdGEtZW5kPVwiMTAxMjFcIj42IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDEyMVwiIGRhdGEtZW5kPVwiMTAxMjlcIj43IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDEyOVwiIGRhdGEtZW5kPVwiMTAxMzdcIj44IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDEzN1wiIGRhdGEtZW5kPVwiMTAxNDZcIj45IG1pbDxcL3RkPlxuPFwvdHI+XG48dHIgZGF0YS1zdGFydD1cIjEwMTQ3XCIgZGF0YS1lbmQ9XCIxMDI4NVwiPlxuPHRkIGRhdGEtc3RhcnQ9XCIxMDE0N1wiIGRhdGEtZW5kPVwiMTAxNzJcIiBkYXRhLWNvbC1zaXplPVwic21cIj50aGlja25lc3MgcmF0aW8gJmx0OyAxMjoxPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMTcyXCIgZGF0YS1lbmQ9XCIxMDE4NFwiPlx1MjI2NCAxLjkwIG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMTg0XCIgZGF0YS1lbmQ9XCIxMDIxM1wiPkhBU0wgKGxlYWRlZCBvciBsZWFkLWZyZWUpPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMjEzXCIgZGF0YS1lbmQ9XCIxMDIyNFwiPiZsdDsgMy41IG1tPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMjI0XCIgZGF0YS1lbmQ9XCIxMDIzNFwiPjAuMDE5NTI8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAyMzRcIiBkYXRhLWVuZD1cIjEwMjQ0XCI+NC41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDI0NFwiIGRhdGEtZW5kPVwiMTAyNTRcIj41LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwMjU0XCIgZGF0YS1lbmQ9XCIxMDI2NFwiPjYuNSBtaWw8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAyNjRcIiBkYXRhLWVuZD1cIjEwMjc0XCI+Ny41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDI3NFwiIGRhdGEtZW5kPVwiMTAyODVcIj44LjUgbWlsPFwvdGQ+XG48XC90cj5cbjx0ciBkYXRhLXN0YXJ0PVwiMTAyODZcIiBkYXRhLWVuZD1cIjEwMzk1XCI+XG48dGQgZGF0YS1zdGFydD1cIjEwMjg2XCIgZGF0YS1lbmQ9XCIxMDMxMVwiIGRhdGEtY29sLXNpemU9XCJzbVwiPnRoaWNrbmVzcyByYXRpbyAmbHQ7IDEyOjE8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAzMTFcIiBkYXRhLWVuZD1cIjEwMzIzXCI+XHUyMjY0IDEuOTAgbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAzMjNcIiBkYXRhLWVuZD1cIjEwMzQwXCI+T3RoZXIgZmluaXNoZXM8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAzNDBcIiBkYXRhLWVuZD1cIjEwMzQ0XCI+XC88XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTAzNDRcIiBkYXRhLWVuZD1cIjEwMzU0XCI+MC4wMTk1MjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDM1NFwiIGRhdGEtZW5kPVwiMTAzNjJcIj40IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDM2MlwiIGRhdGEtZW5kPVwiMTAzNzBcIj41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDM3MFwiIGRhdGEtZW5kPVwiMTAzNzhcIj42IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDM3OFwiIGRhdGEtZW5kPVwiMTAzODZcIj43IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDM4NlwiIGRhdGEtZW5kPVwiMTAzOTVcIj44IG1pbDxcL3RkPlxuPFwvdHI+XG48dHIgZGF0YS1zdGFydD1cIjEwMzk2XCIgZGF0YS1lbmQ9XCIxMDUwNFwiPlxuPHRkIGRhdGEtc3RhcnQ9XCIxMDM5NlwiIGRhdGEtZW5kPVwiMTA0MjFcIiBkYXRhLWNvbC1zaXplPVwic21cIj50aGlja25lc3MgcmF0aW8gJmx0OyAxMjoxPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNDIxXCIgZGF0YS1lbmQ9XCIxMDQzM1wiPiZndDsgMS45MCBtbTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDQzM1wiIGRhdGEtZW5kPVwiMTA0NDBcIj5IQVNMPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNDQwXCIgZGF0YS1lbmQ9XCIxMDQ0NFwiPlwvPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNDQ0XCIgZGF0YS1lbmQ9XCIxMDQ1M1wiPjAuMDI0NjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDQ1M1wiIGRhdGEtZW5kPVwiMTA0NjNcIj41LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNDYzXCIgZGF0YS1lbmQ9XCIxMDQ3M1wiPjYuNSBtaWw8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA0NzNcIiBkYXRhLWVuZD1cIjEwNDgzXCI+Ny41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDQ4M1wiIGRhdGEtZW5kPVwiMTA0OTNcIj44LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNDkzXCIgZGF0YS1lbmQ9XCIxMDUwNFwiPjkuNSBtaWw8XC90ZD5cbjxcL3RyPlxuPHRyIGRhdGEtc3RhcnQ9XCIxMDUwNVwiIGRhdGEtZW5kPVwiMTA2MjRcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiMTA1MDVcIiBkYXRhLWVuZD1cIjEwNTMwXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+dGhpY2tuZXNzIHJhdGlvICZsdDsgMTI6MTxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDUzMFwiIGRhdGEtZW5kPVwiMTA1NDJcIj4mZ3Q7IDEuOTAgbW08XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA1NDJcIiBkYXRhLWVuZD1cIjEwNTU5XCI+T3RoZXIgZmluaXNoZXM8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA1NTlcIiBkYXRhLWVuZD1cIjEwNTYzXCI+XC88XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA1NjNcIiBkYXRhLWVuZD1cIjEwNTczXCI+MC4wMTk1MjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDU3M1wiIGRhdGEtZW5kPVwiMTA1ODNcIj40LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNTgzXCIgZGF0YS1lbmQ9XCIxMDU5M1wiPjUuNSBtaWw8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA1OTNcIiBkYXRhLWVuZD1cIjEwNjAzXCI+Ni41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDYwM1wiIGRhdGEtZW5kPVwiMTA2MTNcIj43LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNjEzXCIgZGF0YS1lbmQ9XCIxMDYyNFwiPjguNSBtaWw8XC90ZD5cbjxcL3RyPlxuPHRyIGRhdGEtc3RhcnQ9XCIxMDYyNVwiIGRhdGEtZW5kPVwiMTA3MzNcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiMTA2MjVcIiBkYXRhLWVuZD1cIjEwNjUwXCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+dGhpY2tuZXNzIHJhdGlvIFx1MjI2NSAxMjoxPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNjUwXCIgZGF0YS1lbmQ9XCIxMDY2MlwiPmFsbCBob2xlczxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDY2MlwiIGRhdGEtZW5kPVwiMTA2NjlcIj5IQVNMPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNjY5XCIgZGF0YS1lbmQ9XCIxMDY3M1wiPlwvPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNjczXCIgZGF0YS1lbmQ9XCIxMDY4MlwiPjAuMDI0NjxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDY4MlwiIGRhdGEtZW5kPVwiMTA2OTJcIj41LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNjkyXCIgZGF0YS1lbmQ9XCIxMDcwMlwiPjYuNSBtaWw8XC90ZD5cbjx0ZCBkYXRhLWNvbC1zaXplPVwic21cIiBkYXRhLXN0YXJ0PVwiMTA3MDJcIiBkYXRhLWVuZD1cIjEwNzEyXCI+Ny41IG1pbDxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDcxMlwiIGRhdGEtZW5kPVwiMTA3MjJcIj44LjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNzIyXCIgZGF0YS1lbmQ9XCIxMDczM1wiPjkuNSBtaWw8XC90ZD5cbjxcL3RyPlxuPHRyIGRhdGEtc3RhcnQ9XCIxMDczNFwiIGRhdGEtZW5kPVwiMTA4NDNcIj5cbjx0ZCBkYXRhLXN0YXJ0PVwiMTA3MzRcIiBkYXRhLWVuZD1cIjEwNzU5XCIgZGF0YS1jb2wtc2l6ZT1cInNtXCI+dGhpY2tuZXNzIHJhdGlvIFx1MjI2NSAxMjoxPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwNzU5XCIgZGF0YS1lbmQ9XCIxMDc3MVwiPmFsbCBob2xlczxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDc3MVwiIGRhdGEtZW5kPVwiMTA3ODhcIj5PdGhlciBmaW5pc2hlczxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDc4OFwiIGRhdGEtZW5kPVwiMTA3OTJcIj5cLzxcL3RkPlxuPHRkIGRhdGEtY29sLXNpemU9XCJzbVwiIGRhdGEtc3RhcnQ9XCIxMDc5MlwiIGRhdGEtZW5kPVwiMTA4MDJcIj4wLjAxOTUyPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwODAyXCIgZGF0YS1lbmQ9XCIxMDgxMFwiPjUgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwODEwXCIgZGF0YS1lbmQ9XCIxMDgxOFwiPjYgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwODE4XCIgZGF0YS1lbmQ9XCIxMDgyNlwiPjcgbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwODI2XCIgZGF0YS1lbmQ9XCIxMDgzNFwiPjggbWlsPFwvdGQ+XG48dGQgZGF0YS1jb2wtc2l6ZT1cInNtXCIgZGF0YS1zdGFydD1cIjEwODM0XCIgZGF0YS1lbmQ9XCIxMDg0M1wiPjkgbWlsPFwvdGQ+XG48XC90cj5cbjxcL3Rib2R5PlxuPFwvdGFibGU+XG48XC9kaXY+XG48XC9kaXY+XG48b2wgc3RhcnQ9XCIyXCIgZGF0YS1zdGFydD1cIjEwODQ1XCIgZGF0YS1lbmQ9XCIxMDk1M1wiPlxuPGxpIGRhdGEtc3RhcnQ9XCIxMDg0NVwiIGRhdGEtZW5kPVwiMTA5NTNcIj5cbjxwIGRhdGEtc3RhcnQ9XCIxMDg0OFwiIGRhdGEtZW5kPVwiMTA5NTNcIj5TcGVjaWFsIGRyaWxsIHNpemVzIChpZiB0b2xlcmFuY2UgJmx0OyAzIG1pbCwgdXNlIHNwZWNpYWwgZHJpbGxzIG9yIDI1IFx1MDBiNW0gaW5jcmVtZW50LCB1c2UgbmVhcmVzdCBkcmlsbCBydWxlKTxcL3A+XG48XC9saT5cbjxcL29sPiIsImRpc3BsYXlfY29uZGl0aW9uX2xpc3QiOlt7ImRpc3BsYXlfY29uZGl0aW9uX2xvZ2luX3N0YXR1cyI6InN1YnNjcmliZXIiLCJfaWQiOiJhNGZkODYwIn1dfSwiZWxlbWVudHMiOltdLCJ3aWRnZXRUeXBlIjoidGV4dC1lZGl0b3IifQ==\\\"]\\t\\t<div class=\\\"elementor-element elementor-element-f7e142f elementor-widget elementor-widget-code-highlight\\\" data-id=\\\"f7e142f\\\" data-element_type=\\\"widget\\\" data-widget_type=\\\"code-highlight.default\\\">\\n\\t\\t\\t\\t<div class=\\\"elementor-widget-container\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"prismjs-default copy-to-clipboard \\\">\\n\\t\\t\\t<pre data-line=\\\"\\\" class=\\\"highlight-height language-aspnet line-numbers\\\">\\n\\t\\t\\t\\t<code readonly=\\\"true\\\" class=\\\"language-aspnet\\\">\\n\\t\\t\\t\\t\\t<xmp>List<double> ContainDrillToolList = new List<double>();\\r\\nContainDrillToolList.AddRange(new double[] { 610, 635, 711, 838, 914, 1016, 1320, 3120 });<\\\/xmp>\\n\\t\\t\\t\\t<\\\/code>\\n\\t\\t\\t<\\\/pre>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t\\t<\\\/div>\\n\\t\\t\\t\\t<\\\/div>\\n\\t\\t[elementor-element k=\\\"0e46bd9387093ca73b9000e38f18cce4\\\" data=\\\"eyJpZCI6ImVjNTQyNGIiLCJlbFR5cGUiOiJ3aWRnZXQiLCJzZXR0aW5ncyI6eyJlZGl0b3IiOiI8cD4zLiBEcmlsbCBDb21wZW5zYXRpb24gQ29kZTxcL3A+IiwiZGlzcGxheV9jb25kaXRpb25fbGlzdCI6W3siZGlzcGxheV9jb25kaXRpb25fbG9naW5fc3RhdHVzIjoic3Vic2NyaWJlciIsIl9pZCI6IjE3YzczOTMifV19LCJlbGVtZW50cyI6W10sIndpZGdldFR5cGUiOiJ0ZXh0LWVkaXRvciJ9\\\"]\\t\\t<div class=\\\"elementor-element elementor-element-3dfeb51 elementor-widget elementor-widget-code-highlight\\\" data-id=\\\"3dfeb51\\\" data-element_type=\\\"widget\\\" data-widget_type=\\\"code-highlight.default\\\">\\n\\t\\t\\t\\t<div class=\\\"elementor-widget-container\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"prismjs-default copy-to-clipboard \\\">\\n\\t\\t\\t<pre data-line=\\\"\\\" class=\\\"highlight-height language-csharp line-numbers\\\">\\n\\t\\t\\t\\t<code readonly=\\\"true\\\" class=\\\"language-csharp\\\">\\n\\t\\t\\t\\t\\t<xmp>\\\/\\\/\\\/<summary>\\r\\n\\\/\\\/\\\/ Calculate the drill bit diameter based on drill compensation parameters\\r\\n\\\/\\\/\\\/<\\\/summary>\\r\\n\\\/\\\/\\\/<param name=\\\"ToolInfo\\\">Drill tool basic information<\\\/param>\\r\\n\\\/\\\/\\\/<param name=\\\"UpParam\\\">Drill compensation parameters<\\\/param>\\r\\n\\\/\\\/\\\/<param name=\\\"ContainDrillToolList\\\">Special drill bit diameter list<\\\/param>\\r\\n\\\/\\\/\\\/<returns>Return 1 if calculation is successful<\\\/returns>\\r\\npublic static int getDrillUpSize(Mod_tool ToolInfo, gToolUpParam UpParam, List<double> ContainDrillToolList)\\r\\n{\\r\\n    if (ContainDrillToolList == null) ContainDrillToolList = new List<double>();\\r\\n    gToolUpParamHole UpParamHole = new G_Helper.gToolUpParamHole();\\r\\n    switch (ToolInfo.type)\\r\\n    {\\r\\n        case \\\"via\\\":\\r\\n            UpParamHole = UpParam.Via;\\r\\n            break;\\r\\n        case \\\"plate\\\":\\r\\n            UpParamHole = UpParam.Pth;\\r\\n            break;\\r\\n        case \\\"nplate\\\":\\r\\n            UpParamHole = UpParam.Npth;\\r\\n            break;\\r\\n    }\\r\\n    ToolInfo.max_tol = Math.Round(UpParamHole.Max_Tol, 0);\\r\\n    ToolInfo.min_tol = Math.Round(UpParamHole.Min_Tol, 0);\\r\\n    if (ToolInfo.finish_size < 50)\\r\\n    {\\r\\n        ToolInfo.finish_size = ToolInfo.drill_size;\\r\\n    }\\r\\n    double DrillSlotLevel = (ToolInfo.shape == \\\"slot\\\") ? UpParam.SlotLevel : UpParam.DrillLevel;  \\\/\\\/Drill step interval: Round holes have two levels (25\\\/50\\u03bcm), slot holes have one level (50\\u03bcm)\\r\\n    double UpLevel;\\r\\n    if (UpParam.DrillLevel > 49) \\\/\\\/When the step interval is 50\\u03bcm, do not use special drill bits\\r\\n    {\\r\\n        ContainDrillToolList = new List<double>();\\r\\n        UpLevel = UpParamHole.UpLevel;\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        UpLevel = UpParam.DrillLevel * 0.5;   \\\/\\\/Select drill bit by half of the step interval\\r\\n    }\\r\\n\\r\\n    double Drillfinish_size = ToolInfo.finish_size + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \\\/\\\/Average the upper and lower tolerance\\r\\n    int DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal) \\\/ DrillSlotLevel)); \\\/\\\/Drill step count\\r\\n    double DrillsizeInt = DrillLevelCount * DrillSlotLevel; \\\/\\\/Round down to the nearest drill step\\r\\n    double DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal) % DrillSlotLevel;\\\/\\\/Remainder of drill size after step division\\r\\n    double DrillsizeLevel = (DrillsizeFloat > UpLevel) ? DrillSlotLevel : 0;\\\/\\\/Determine whether to round up the remainder\\r\\n\\r\\n    \\\/\\\/Check if special drill bits are included\\r\\n    int ContainDrillIndex = ContainDrillToolList.FindIndex(tt => (int)(Math.Floor(tt \\\/ DrillSlotLevel)) == DrillLevelCount);\\r\\n    if (ContainDrillIndex > -1)\\r\\n    {\\r\\n        double ContainDrillFloat = ContainDrillToolList[ContainDrillIndex] % DrillSlotLevel;\\\/\\\/Remainder of special drill bit size after step division\\r\\n        if (DrillsizeFloat > UpLevel) \\\/\\\/ e.g. 38 > 20\\r\\n        {\\r\\n            double diff1 = Math.Abs(DrillsizeFloat - DrillSlotLevel);   \\\/\\\/e.g. 40-50\\r\\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \\\/\\\/e.g. 40-38\\r\\n            DrillsizeLevel = (diff1 < diff2) ? DrillSlotLevel : ContainDrillFloat;\\r\\n        }\\r\\n        else \\\/\\\/if (ContainDrillFloat < UpLevel)\\r\\n        {\\r\\n            double diff1 = Math.Abs(DrillsizeFloat - 0);  \\\/\\\/e.g. 12-0\\r\\n            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  \\\/\\\/e.g. 12-16\\r\\n            DrillsizeLevel = (diff1 < diff2) ? 0 : ContainDrillFloat;\\r\\n        }\\r\\n    }\\r\\n    ToolInfo.drill_size = DrillsizeInt + DrillsizeLevel;\\r\\n\\r\\n    double DiffDrillSizeUp = ToolInfo.drill_size - ToolInfo.finish_size;\\r\\n    if (ToolInfo.shape == \\\"slot\\\") \\\/\\\/ Slot length compensation\\r\\n    {\\r\\n        if (UpParam.isSlotUpLevel) \\\/\\\/Whether to round the slot length to step interval\\r\\n        {\\r\\n            Drillfinish_size = ToolInfo.slot_len + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  \\\/\\\/Average the upper and lower tolerance\\r\\n            DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) \\\/ DrillSlotLevel)); \\\/\\\/ Drill step count\\r\\n            DrillsizeInt = DrillLevelCount * DrillSlotLevel; \\\/\\\/Round down to the nearest drill step (50\\u03bcm)\\r\\n            DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) % DrillSlotLevel;\\\/\\\/Remainder of slot length after step division\\r\\n            DrillsizeLevel = (DrillsizeFloat > UpParamHole.UpLevel) ? DrillSlotLevel : 0;\\\/\\\/Determine whether to round up the remainder\\r\\n            ToolInfo.slot_len = DrillsizeInt + DrillsizeLevel;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            DrillsizeInt = Math.Floor((ToolInfo.slot_len + DiffDrillSizeUp) \\\/ 10) * 10; \\\/\\\/ Round down to the nearest 10\\u03bcm\\r\\n            ToolInfo.slot_len = DrillsizeInt;\\r\\n        }\\r\\n        ToolInfo.drill_size += UpParam.SlotEndNumber;  \\\/\\\/ Add suffix number for slot drill bit segmentation\\r\\n    }\\r\\n    ToolInfo.bit = Math.Round((ToolInfo.drill_size * 0.001), 3).ToString();\\r\\n    return 1;\\r\\n}\\r\\n\\r\\npublic class gToolUpParam\\r\\n{\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for VIA holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Via { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for PTH (Plated Through Hole) (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Pth { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation parameters for NPTH (Non-Plated Through Hole) (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public gToolUpParamHole Npth { get; set; } = new gToolUpParamHole();\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval for round drill holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double DrillLevel { get; set; } = 50;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval for slot drill holes (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double SlotLevel { get; set; } = 50;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Suffix number for slot drill bit segmentation\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public int SlotEndNumber { get; set; } = 0;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Additional compensation value for slot length (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double SlotLengthUp { get; set; } = 0;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Whether to round the slot length to step interval\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public bool isSlotUpLevel { get; set; } = false;\\r\\n}\\r\\n\\r\\npublic class gToolUpParamHole\\r\\n{\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Compensation value (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double UpVal { get; set; } = 100;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Step interval threshold for rounding up (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double UpLevel { get; set; } = 25;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Upper tolerance (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double Max_Tol { get; set; } = 76;\\r\\n    \\\/\\\/\\\/ <summary>\\r\\n    \\\/\\\/\\\/ Lower tolerance (in \\u03bcm)\\r\\n    \\\/\\\/\\\/ <\\\/summary>\\r\\n    public double Min_Tol { get; set; } = 76;\\r\\n}\\r\\n\\r\\n\\\/\\\/\\\/<summary>\\r\\n\\\/\\\/\\\/ Mod_tool: Drill tool attribute model\\r\\n\\\/\\\/\\\/<\\\/summary>\\r\\npublic class Mod_tool\\r\\n{\\r\\n    public int num { get; set; }\\r\\n    public string type { get; set; } \\\/\\\/ Hole type: via\\\/plate(nplate)\\r\\n    public string shape { get; set; } \\\/\\\/ Hole shape: round\\\/slot\\r\\n    public double finish_size { get; set; } \\\/\\\/ Finished hole size (in \\u03bcm)\\r\\n    public double drill_size { get; set; } \\\/\\\/ Drill bit size (in \\u03bcm)\\r\\n    public double max_tol { get; set; } \\\/\\\/ Upper tolerance (in \\u03bcm)\\r\\n    public double min_tol { get; set; } \\\/\\\/ Lower tolerance (in \\u03bcm)\\r\\n    public double slot_len { get; set; } \\\/\\\/ Slot length (in \\u03bcm)\\r\\n    public string bit { get; set; } \\\/\\\/ Drill bit size (in mm, formatted string)\\r\\n}<\\\/xmp>\\n\\t\\t\\t\\t<\\\/code>\\n\\t\\t\\t<\\\/pre>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t\\t<\\\/div>\\n\\t\\t\\t\\t<\\\/div>\\n\\t\\t[elementor-element k=\\\"0e46bd9387093ca73b9000e38f18cce4\\\" data=\\\"eyJpZCI6IjU3OGViMjYiLCJlbFR5cGUiOiJ3aWRnZXQiLCJzZXR0aW5ncyI6eyJlZGl0b3IiOiI8aDIgZGF0YS1zdGFydD1cIjEwOTYwXCIgZGF0YS1lbmQ9XCIxMTAxN1wiPjYuIFdoeSBkb2VzIGJvYXJkIHRoaWNrbmVzcyBhZmZlY3QgZHJpbGwgY29tcGVuc2F0aW9uPzxcL2gyPlxuPHAgZGF0YS1zdGFydD1cIjExMDE5XCIgZGF0YS1lbmQ9XCIxMTQ2NFwiPkkgZGlkIG5vdCB1bmRlcnN0YW5kIHRoaXMgYXQgZmlyc3QgZWl0aGVyLiBUaGUgbWFpbiByZWFzb24gaXMgdGhlIGhpZ2ggPHN0cm9uZyBkYXRhLXN0YXJ0PVwiMTEwOTBcIiBkYXRhLWVuZD1cIjExMTIxXCI+dGhpY2tuZXNzLXRvLWRpYW1ldGVyIHJhdGlvPFwvc3Ryb25nPiAoYm9hcmQgdGhpY2tuZXNzIGRpdmlkZWQgYnkgaG9sZSBkaWFtZXRlcikuIEEgaGlnaCByYXRpbyBtYWtlcyB0aGUgY29wcGVyIGF0IHRoZSBob2xlIGNlbnRlciB0aGlubmVyIGFuZCB0aGUgY29wcGVyIGF0IHRoZSBob2xlIGVkZ2UgdGhpY2tlci4gVG8gY29tcHV0ZSB0aGUgdGhpY2tuZXNzLXRvLWRpYW1ldGVyIHJhdGlvIHlvdSBuZWVkIHRoZSBib2FyZCB0aGlja25lc3MgdmFsdWUuIFNvIGJvYXJkIHRoaWNrbmVzcyBlbnRlcnMgdGhlIGRyaWxsIGNvbXBlbnNhdGlvbiBydWxlcy4gRm9yIGhpZ2ggdGhpY2tuZXNzLXRvLWRpYW1ldGVyIGhvbGVzLCB0aGUgY29tcGVuc2F0aW9uIGlzIGxhcmdlci48XC9wPiIsImRpc3BsYXlfY29uZGl0aW9uX2xpc3QiOlt7ImRpc3BsYXlfY29uZGl0aW9uX2xvZ2luX3N0YXR1cyI6InN1YnNjcmliZXIiLCJfaWQiOiI3MTVjNjlhIn1dfSwiZWxlbWVudHMiOltdLCJ3aWRnZXRUeXBlIjoidGV4dC1lZGl0b3IifQ==\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t\\t\\t<\\\/div>\\n\\t\\t\",\"scripts\":[],\"styles\":[]}}"],"_uag_css_file_name":["uag-css-4575.css"],"_uag_js_file_name":["uag-js-4575.js"]},"uagb_featured_image_src":{"full":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed.webp",800,533,false],"thumbnail":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed-150x150.webp",150,150,true],"medium":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed-300x200.webp",300,200,true],"medium_large":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed-768x512.webp",768,512,true],"large":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed.webp",800,533,false],"1536x1536":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed.webp",800,533,false],"2048x2048":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed.webp",800,533,false],"trp-custom-language-flag":["https:\/\/flj-pcb.com\/wp-content\/uploads\/2025\/12\/About-PCB-Drill-Compensation_compressed-18x12.webp",18,12,true]},"uagb_author_info":{"display_name":"Philifast","author_link":"https:\/\/flj-pcb.com\/szl\/author\/2475017442jygmail-com\/"},"uagb_comment_info":1,"uagb_excerpt":"There are no great individuals, only great teams. With the team working together, the first-stage PCB CAM automation project for [&hellip;]","_links":{"self":[{"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/posts\/4575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/comments?post=4575"}],"version-history":[{"count":5,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/posts\/4575\/revisions"}],"predecessor-version":[{"id":4582,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/posts\/4575\/revisions\/4582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/media\/4584"}],"wp:attachment":[{"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/media?parent=4575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/categories?post=4575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flj-pcb.com\/szl\/wp-json\/wp\/v2\/tags?post=4575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}