You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nowinandroid/tmp/r8analysis/step_2.html

4652 lines
466 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>R8 Configuration Analyzer</title>
<style>/* ==========================================================================
1. VARIABLES & THEME CONFIGURATION
========================================================================== */
:root {
/* --- Colors: Backgrounds --- */
--bg-body: #f8fafc;
/* --- Colors: Borders --- */
--border-color: #e2e8f0;
/* --- Colors: Functional (Status) --- */
--text-green-600: oklch(37.1% 0 0);
/* --- Colors: Palette (Extended) --- */
--text-blue-600: #2563eb;
/* --- Colors: Text --- */
--text-main: #0f172a;
/* --- Shadows --- */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
/* --- Typography --- */
--font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--bg-active: #e5e7eb;
--bg-card: #ffffff;
--bg-green-light: #dcfce7;
--bg-header: #ffffff;
--bg-hover: #f3f4f6;
--bg-red-light: #fee2e2;
--bg-selected: #eff6ff;
--bg-subtle: #f9fafb;
--bg-tooltip: #1f2937;
--bg-yellow-light: #fef9c3;
--border-interactive: #d1d5db;
--border-light: #f1f5f9;
--font-family-mono: "SF Mono", "Consolas", "Liberation Mono", Menlo, monospace;
--text-muted: #94a3b8;
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
--text-blue-700: #1d4ed8;
--text-gray-500: #6b7280;
--text-gray-900: #111827;
--text-inverse: #ffffff;
--text-link-hover: #1d4ed8;
--text-link: #2563eb;
--text-orange-600: #ea580c;
--text-red-600: #dc2626;
--text-subtle: #64748b;
--text-yellow-600: #ca8a04;
}
/* ==========================================================================
2. RESET & BASE STYLES
========================================================================== */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
scrollbar-color: var(--border-color) transparent;
scrollbar-width: thin;
}
/* Custom Scrollbar */
::-webkit-scrollbar {
height: 8px;
width: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background-color: #cbd5e1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background-color: #94a3b8;
}
html,
body {
height: 100%;
overflow: hidden;
}
body {
background-color: var(--bg-body);
color: var(--text-main);
display: flex;
flex-direction: column;
font-family: var(--font-family-base);
-webkit-font-smoothing: antialiased;
line-height: 1.5;
}
a {
color: inherit;
text-decoration: none;
}
input {
font-family: inherit;
outline: none;
}
button {
background: none;
border: none;
cursor: pointer;
font-family: inherit;
outline: none;
}
/* ==========================================================================
3. UTILITY CLASSES
========================================================================== */
.hidden {
display: none !important;
}
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.flex-1 {
flex: 1 1 0%;
}
.items-center {
align-items: center;
}
.justify-between {
justify-content: space-between;
}
.justify-center {
justify-content: center;
}
.relative {
position: relative;
}
.text-center {
text-align: center;
}
.text-left {
text-align: left;
}
.font-bold {
font-weight: 700;
}
.font-medium {
font-weight: 500;
}
.text-sm {
font-size: 0.875rem;
}
.text-xs {
font-size: 0.75rem;
}
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cursor-pointer {
cursor: pointer;
}
/* Colors */
.text-green-600 {
color: var(--text-green-600);
}
.text-yellow-600 {
color: var(--text-yellow-600);
}
.text-orange-600 {
color: var(--text-orange-600);
}
.text-red-600 {
color: var(--text-red-600);
}
.text-gray-500 {
color: var(--text-gray-500);
}
/* Backgrounds & Interaction */
.hover-bg-gray-100:hover {
background-color: var(--bg-hover) !important;
}
.bg-gray-200 {
background-color: var(--bg-active) !important;
color: var(--text-gray-900) !important;
font-weight: 500;
}
/* ==========================================================================
4. LAYOUT & CONTAINER
========================================================================== */
header {
background-color: var(--bg-header);
border-bottom: 1px solid var(--border-color);
box-shadow: var(--shadow-sm);
flex-shrink: 0;
z-index: 50;
}
.container-custom {
display: flex;
flex-direction: column;
flex: 1;
margin: 0 auto;
max-width: 1800px;
min-height: 0;
overflow: visible;
padding: 1.5rem;
width: 100%;
}
main {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
overflow: visible;
}
/* ==========================================================================
5. HEADER COMPONENTS
========================================================================== */
.header-top-row {
align-items: center;
border-bottom: 1px solid var(--border-light);
display: flex;
justify-content: space-between;
margin: 0 auto;
max-width: 1800px;
padding: 0.5rem 1.5rem;
}
.header-branding {
/* border-right: 1px solid var(--border-color); */
display: flex;
flex-direction: column;
padding-right: 1rem;
}
.header-branding .header-title {
color: var(--text-main);
font-size: 1.25rem;
font-weight: 700;
letter-spacing: -0.025em;
}
p#report-date {
font-size: 0.8125rem;
color: var(--text-subtle);
margin-top: 0.125rem;
}
#ts-all-state {
align-items: center;
display: flex;
gap: 0.2rem;
justify-content: center;
}
.header-stats {
display: flex;
gap: 2rem;
}
.stat-item {
align-items: flex-start;
display: flex;
flex-direction: column;
}
.stat-label {
color: var(--text-muted);
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
}
.stat-value {
font-size: 0.95rem;
font-weight: 700;
}
.header-toolbar {
background-color: #ffffff;
}
.header-toolbar-inner {
align-items: center;
display: flex;
gap: 1rem;
height: 46px;
justify-content: space-between;
margin: 0 auto;
max-width: 1800px;
padding: 0 1.5rem;
width: 100%;
}
/* ==========================================================================
6. INTERACTIVE COMPONENTS (Buttons, Inputs, Chips)
========================================================================== */
/* Icon Buttons */
.icon-btn {
background: transparent;
border-radius: 0.375rem;
border: 1px solid transparent;
color: var(--text-subtle);
cursor: pointer;
display: flex;
height: 32px;
align-items: center;
justify-content: center;
transition: all 0.2s;
width: 32px;
color: var(--text-subtle);
}
button#group-by-btn:hover,
.icon-btn:hover,
.icon-btn.active {
background-color: var(--bg-hover) !important;
color: var(--text-main) !important;
}
/* Filter Chips */
.filter-chip {
/* blue-50 */
color: #1e40af;
/* blue-800 */
border: 1px solid #dbeafe;
/* blue-100 */
border-radius: 9999px;
align-items: center;
background-color: #eff6ff;
cursor: pointer;
display: inline-flex;
font-size: 0.8125rem;
font-weight: 500;
gap: 0.375rem;
padding: 0.25rem 0.5rem;
transition: all 0.2s;
white-space: nowrap;
}
.filter-chip:hover {
background-color: #dbeafe;
}
.filter-chip.active {
box-shadow: 0 0 0 2px #2563eb;
}
.chip-close {
border-radius: 9999px;
color: #2563eb;
display: inline-flex;
margin-left: 0.25rem;
margin-right: -0.25rem;
padding: 0.125rem;
transition: background-color 0.2s, color 0.2s;
}
.chip-close:hover {
background-color: #bfdbfe;
color: #1e40af;
}
.filter-icon {
align-items: center;
color: var(--text-gray-500);
display: flex;
justify-content: center;
}
/* Add Filter Button */
.add-filter-btn {
align-items: center;
background: transparent;
border-radius: 0.375rem;
border: 1px dashed var(--border-interactive);
color: var(--text-gray-500);
cursor: pointer;
display: flex;
font-size: 0.8125rem;
font-weight: 500;
gap: 0.25rem;
padding: 0.25rem 0.5rem;
transition: all 0.2s;
}
.add-filter-btn:hover {
background-color: var(--bg-hover);
border-color: var(--text-gray-500);
color: var(--text-gray-900);
}
/* Segmented Controls */
.segmented-control {
background-color: var(--bg-hover);
border-radius: 0.375rem;
display: flex;
padding: 2px;
}
.segment-btn {
align-items: center;
background-color: transparent;
border-radius: 0.25rem;
border: none;
color: var(--text-gray-500);
cursor: pointer;
display: flex;
font-size: 0.8125rem;
font-weight: 500;
height: 24px;
justify-content: center;
padding: 0 1rem;
transition: all 0.2s ease;
}
.segment-btn:hover:not(.active) {
color: var(--text-gray-900);
}
.segment-btn.active {
background-color: #ffffff;
box-shadow: var(--shadow-sm);
color: var(--text-link);
}
/* Search Bar */
.search-bar-container {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 0.375rem;
border: 1px solid transparent;
background: transparent;
color: var(--text-subtle);
transition: all 0.2s;
cursor: pointer;
}
.search-bar-container:hover {
background-color: var(--bg-hover);
color: var(--text-main);
}
.search-bar-container.active {
border-color: var(--border-interactive);
background-color: #ffffff;
padding: 0.25rem 0.5rem;
width: auto;
height: auto;
}
.search-bar-input {
border: none;
outline: none;
padding: 0;
font-size: 0.8125rem;
width: 0;
transition: width 0.2s, padding 0.2s;
background: transparent;
}
.search-bar-container.active .search-bar-input {
width: 150px;
padding: 0.25rem 0.5rem;
}
.search-bar-icon {
color: var(--text-gray-500);
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
}
/* Dropdowns */
.dropdown-menu {
/* Changed from hidden to allow submenus */
animation: fadeIn 0.1s ease-out;
background: var(--bg-card);
border-radius: 0.5rem;
border: 1px solid var(--border-color);
box-shadow: var(--shadow-lg);
left: 0;
margin-top: 0.5rem;
min-width: 180px;
overflow: visible;
position: absolute;
top: 100%;
z-index: 100;
}
.dropdown-menu.right-0 {
left: auto;
right: 0;
}
.dropdown-menu:not(.hidden) {
display: block;
}
/* Ensure visibility toggling works */
.dropdown-item {
color: var(--text-gray-900);
cursor: pointer;
display: block;
font-size: 0.875rem;
padding: 0.5rem 1rem;
transition: background-color 0.15s;
}
.dropdown-item:hover {
background-color: var(--bg-hover);
}
/* Popover Content */
.popover-search-container {
background: var(--bg-card);
border-bottom: 1px solid var(--border-color);
padding: 0.5rem;
position: sticky;
top: 0;
z-index: 2;
}
.popover-search {
border-radius: 0.375rem;
border: 1px solid var(--border-interactive);
font-size: 0.8125rem;
padding: 0.375rem 0.5rem;
width: 100%;
}
.popover-search:focus {
border-color: var(--text-link);
}
.popover-list {
max-height: 250px;
overflow-y: auto;
padding: 0.25rem 0;
}
.popover-item {
align-items: center;
color: var(--text-gray-900);
cursor: pointer;
display: flex;
font-size: 0.875rem;
gap: 0.5rem;
padding: 0.375rem 1rem;
transition: background-color 0.15s;
}
.popover-item:hover {
background-color: var(--bg-hover);
}
.active-item {
background-color: var(--bg-selected);
color: var(--text-link);
font-weight: 600;
}
.popover-checkbox {
accent-color: var(--text-link);
height: 1rem;
margin-top: 1px;
width: 1rem;
}
/* Action-Based Dropdown Styles */
.dropdown-action-zone {
align-items: center;
background-color: var(--bg-subtle);
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
padding: 0.5rem 1rem;
position: sticky;
top: 0;
z-index: 10;
}
.dropdown-action-btn {
background: none;
border: none;
color: var(--text-link);
cursor: pointer;
font-size: 0.8125rem;
font-weight: 600;
padding: 0;
}
.dropdown-action-btn:hover {
color: var(--text-link-hover);
text-decoration: underline;
}
.dropdown-scroll-zone {
max-height: 250px;
overflow-y: auto;
padding: 0.25rem 0;
}
/* ==========================================================================
7. BREADCRUMBS
========================================================================== */
.breadcrumb-row {
align-items: center;
display: flex;
height: 28px;
justify-content: space-between;
margin-bottom: 1rem;
}
.breadcrumb-pill {
border-radius: 0.375rem;
color: #4b5563;
cursor: pointer;
font-size: 0.875rem;
font-weight: 500;
padding: 0.25rem 0.5rem;
transition: all 0.2s;
}
.breadcrumb-pill:hover {
background-color: var(--bg-selected);
border-color: var(--text-link);
color: var(--text-link-hover);
}
.breadcrumb-text {
color: var(--text-gray-900);
font-size: 0.875rem;
font-weight: 600;
padding: 0.25rem 0.5rem;
}
div#flat-breadcrumbs .mx-1 {
opacity: .2;
}
/* ==========================================================================
8. TABLES & DATA GRID
========================================================================== */
.table-container {
background: var(--bg-card);
border-radius: 0.5rem;
border: 1px solid var(--border-color);
box-shadow: var(--shadow-sm);
flex: 1;
overflow-x: auto;
}
table {
border-collapse: collapse;
min-width: 800px;
text-align: left;
width: 100%;
}
thead {
background: #f8fafc;
position: sticky;
top: 0;
z-index: 20;
}
th {
border-bottom: 1px solid var(--border-color);
color: var(--text-subtle);
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.05em;
padding: 0.75rem 1rem;
text-transform: uppercase;
white-space: nowrap;
}
td {
border-bottom: 1px solid var(--border-color);
color: var(--text-main);
font-size: 0.875rem;
padding: 0.75rem 1rem;
transition: padding 0.2s ease;
white-space: nowrap;
}
tr {
background: var(--bg-card);
transition: background 0.2s;
}
tbody tr:hover {
background-color: var(--bg-selected) !important;
}
/* Sticky Columns (Name) */
.sticky-name {
background: inherit;
border-right: 1px solid var(--border-color);
box-shadow: 2px 0 4px -2px rgba(0, 0, 0, 0.05);
left: 0;
max-width: 400px;
position: sticky;
white-space: normal;
width: 400px;
word-break: break-all;
z-index: 10;
}
thead th.sticky-name {
z-index: 30;
}
th.truncate,
td.truncate {
border-right: 1px solid var(--border-color);
max-width: 150px !important;
}
td.truncate span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes blink-animation {
0% {
background-color: rgba(253, 224, 71, 0.5);
}
50% {
background-color: rgba(253, 224, 71, 0.1);
}
100% {
background-color: transparent;
}
}
/* CSS Tooltip */
[data-tooltip] {
position: relative;
}
[data-tooltip]:hover::after {
animation: 0.15s ease-out;
background-color: var(--bg-tooltip);
border-radius: 0.25rem;
top: 150%;
box-shadow: var(--shadow-md);
color: var(--text-inverse);
content: attr(data-tooltip);
font-size: 0.75rem;
left: 50%;
padding: 0.25rem 0.5rem;
pointer-events: none;
position: absolute;
transform: translateX(-50%);
white-space: normal;
z-index: 1000;
width: 260px;
text-transform: none;
font-size: 12px;
font-weight: 300;
}
/* Impact Tags */
.impact-container {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.impact-tag {
background-color: var(--bg-hover);
border-radius: 0.25rem;
border: 1px solid var(--border-color);
color: var(--text-gray-900);
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.025em;
padding: 0.125rem 0.375rem;
text-transform: uppercase;
}
#report-view .breadcrumb-row {
margin-bottom: 1rem !important;
}
/* Floating Action Button */
.fab {
position: fixed;
bottom: 1.5rem;
right: 1.5rem;
padding: 0.5rem 1rem;
border-radius: 2rem;
background-color: #1a202c;
color: #ffffff;
display: none;
align-items: center;
gap: 0.5rem;
box-shadow: var(--shadow-lg);
cursor: pointer;
transition: transform 0.2s, background-color 0.2s;
z-index: 1000;
border: none;
font-size: 0.875rem;
font-weight: 600;
}
.fab:hover {
background-color: #2d3748;
transform: scale(1.05);
}
/* Side Panel */
.side-panel {
position: fixed;
top: 0;
right: 0;
width: 400px;
height: 100%;
background-color: #ffffff;
box-shadow: var(--shadow-lg);
z-index: 1001;
display: flex;
flex-direction: column;
transition: transform 0.3s ease-in-out;
transform: translateX(100%);
border-left: 1px solid var(--border-color);
}
.side-panel.open {
transform: translateX(0);
}
.side-panel-header {
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
}
.side-panel-header .header-left {
display: flex;
align-items: center;
gap: 0.5rem;
}
.side-panel-header h2 {
font-size: 1.5rem;
font-weight: 700;
color: #000000;
}
.side-panel-content {
padding: 1.5rem;
overflow-y: auto;
flex: 1;
}
.help-section {
margin-bottom: 1.5rem;
}
.help-section-title {
font-size: 0.75rem;
font-weight: 700;
color: #718096;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 0.75rem;
}
.help-section p {
font-size: 0.875rem;
color: #2d3748;
line-height: 1.6;
}
/* Legend Cards (Accordion) */
.legend-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.legend-item {
background-color: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 0.5rem;
cursor: pointer;
transition: background-color 0.2s, border-color 0.2s;
overflow: hidden;
}
.legend-item:hover {
background-color: #f8fafc;
border-color: #cbd5e1;
}
.legend-item-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1rem;
}
.legend-item-title {
font-size: 0.875rem;
font-weight: 500;
color: #1a202c;
}
.legend-item-arrow {
color: #a0aec0;
transition: transform 0.2s;
}
.legend-item.open .legend-item-arrow {
transform: rotate(90deg);
}
.legend-item-content {
padding: 0 1rem 0.75rem 1rem;
font-size: 0.875rem;
color: #4a5568;
line-height: 1.5;
display: none;
}
.legend-item.open .legend-item-content {
display: block;
}
/* Documentation Links (Cards) */
.doc-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.doc-card {
display: flex;
justify-content: space-between;
align-items: self-start;
padding: 0.75rem 1rem;
background-color: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 0.5rem;
text-decoration: none;
transition: background-color 0.2s, border-color 0.2s;
}
.doc-card:hover {
background-color: #f8fafc;
border-color: #cbd5e1;
}
.doc-card-info {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.doc-card-title {
font-size: 0.875rem;
font-weight: 500;
color: #2563eb;
}
.doc-card-domain {
font-size: 0.75rem;
color: #718096;
}
.doc-card-desc {
font-size: 0.75rem;
color: #4a5568;
}
.doc-card-icon {
color: #a0aec0;
}
/* Tooltip Icon */
.tooltip-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1rem;
height: 1rem;
color: #a0aec0;
cursor: pointer;
margin-left: 0.25rem;
vertical-align: middle;
border: 1px solid #a0aec0;
border-radius: 50%;
font-size: 0.75rem;
}
.tooltip-icon:hover {
color: #718096;
}
.divider {
border-top: 1px solid #e2e8f0;
margin: 1.5rem 0;
}</style>
<script src="https://cdn.jsdelivr.net/npm/protobufjs@7.2.4/dist/protobuf.min.js"></script>
</head>
<body>
<header>
<div class="header-top-row">
<div class="flex items-center" style="display: flex; align-items: center">
<div class="header-branding">
<h1 class="header-title" id="report-name"><a href="#" id="header-link" style="color: inherit; text-decoration: none;">R8 Configuration Analyzer</a></h1>
</div>
</div>
<div class="header-stats">
<div class="stat-item">
<span class="stat-label">Shrinking</span><span class="stat-value" id="total-shrinking"></span>
</div>
<div class="stat-item">
<span class="stat-label">Optimization</span><span class="stat-value" id="total-optimization"></span>
</div>
<div class="stat-item">
<span class="stat-label">Obfuscation</span><span class="stat-value" id="total-obfuscation"></span>
</div>
</div>
</div>
<div class="header-toolbar">
<div id="report-view-controls" class="header-toolbar-inner">
<div class="flex-1" style="display: flex; align-items: center; gap: 1rem; justify-content: flex-start">
<div class="filter-icon" title="Filter Options">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24"
stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M7 12h10M10 18h4" />
</svg>
</div>
<div id="filter-chips-container" style="display: flex; align-items: center; gap: 0.5rem">
<div class="segmented-control" id="lens-tabs">
<button class="segment-btn active" data-lens="All">All Rules</button>
<button class="segment-btn" data-lens="Identical">Identical</button>
<button class="segment-btn" data-lens="Subsumed">Subsumed</button>
<button class="segment-btn" data-lens="Unused">Unused</button>
</div>
<span class="tooltip-icon" id="lenses-tooltip-icon" style="cursor: pointer; margin-right: 0.5rem;"
data-tooltip="Filter rules to a specific opportunity.">?</span>
<div class="relative" id="add-filter-container">
<button id="add-filter-btn" class="add-filter-btn">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24"
stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4" />
</svg>
Add filter
</button>
<div id="add-filter-dropdown" class="dropdown-menu hidden" style="min-width: 10rem">
<div id="add-filter-list"></div>
</div>
</div>
<div class="relative hidden" id="cls-chip-container">
<button id="cls-filter-btn" class="filter-chip">
<span id="cls-filter-text">Classes: All</span>
</button>
<div id="cls-dropdown" class="dropdown-menu hidden"></div>
</div>
<div class="relative hidden" id="field-chip-container">
<button id="field-filter-btn" class="filter-chip">
<span id="field-filter-text">Fields: All</span>
</button>
<div id="field-dropdown" class="dropdown-menu hidden"></div>
</div>
<div class="relative hidden" id="method-chip-container">
<button id="method-filter-btn" class="filter-chip">
<span id="method-filter-text">Methods: All</span>
</button>
<div id="method-dropdown" class="dropdown-menu hidden"></div>
</div>
</div>
</div>
<div class="flex-1" style="display: flex; align-items: center; gap: 0.75rem; justify-content: flex-end">
<div id="search-container" class="search-bar-container relative">
<div class="search-bar-icon" id="search-icon-btn">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 24 24"
stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z">
</path>
</svg>
</div>
<input type="text" id="search-input" class="search-bar-input" placeholder="Search report...">
<button id="clear-search-btn" class="hidden"
style="color: var(--text-gray-500); display: flex; align-items: center; justify-content: center;">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 24 24"
stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z">
</path>
</svg>
</button>
</div>
<div class="relative" id="columns-toggle-container">
<button id="toggle-columns-btn" class="icon-btn" title="Toggle Columns">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24"
stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round"
d="M9 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h4m0-18h10a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H9m0-18v18"></path>
</svg>
</button>
<div id="columns-dropdown" class="dropdown-menu right-0 hidden" style="min-width: 150px">
<label class="popover-item"
style="display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 0.75rem; cursor: pointer;">
<input type="checkbox" class="popover-checkbox" id="toggle-blocked-by-rule-cb" checked>
<span style="font-size: 0.75rem; font-weight: 500; color: var(--text-main);">Blocked by Rule</span>
</label>
</div>
</div>
<div class="relative" id="group-by-container">
<button id="group-by-btn" class="dropdown-btn"
style="border: none; background: #f8f8f8; padding: 0.5rem 0.75rem; display: flex; align-items: center; border-radius: 4px;">
<span style="font-weight: 500; color: var(--text-gray-400)">Group by:</span>
<span id="group-by-text" style="font-weight: 600; color: var(--text-gray-500); margin-left: 0.25rem">Keep
Rules</span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24"
stroke="currentColor"
style="margin-left: 0.25rem; color: var(--text-gray-500); width: 16px; height: 16px;">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
<div id="group-by-dropdown" class="dropdown-menu right-0 hidden" style="min-width: 150px">
<div class="dropdown-item" data-value="modules">Keep Rules</div>
<div class="dropdown-item" data-value="packages">Keep Rule Files</div>
</div>
</div>
</div>
</div>
</div>
</header>
<div id="report-view" class="container-custom">
<main>
<div class="breadcrumb-row" style="margin-bottom: 2rem; height: auto;">
<div id="flat-breadcrumbs"></div>
</div>
<div id="stats-container" style="display: flex; gap: 1rem; padding: 0rem; margin-bottom: 1rem;">
<!-- Shrinking Card -->
<div class="stat-card"
style="background: #ffffff; padding: 1rem; border-radius: 0.5rem; border: 1px solid var(--border-color); flex: 1;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
<div style="color: var(--text-muted); font-size: 0.75rem; text-transform: uppercase; font-weight: 600; display: flex; align-items: center; gap: 0.25rem;">
Shrinking <span class="tooltip-icon" data-tooltip="Shrinking score tracks the percentage of unused code and resources that have been successfully removed from your application. When R8 performs shrinking, it reduces the overall size of your application by identifying and eliminating code and resources that are not actually being used, ensuring your final build is as lean as possible.">?</span></div>
<div id="card-total-shrinking" style="font-size: 1rem; font-weight: 700; color: var(--text-yellow-600);">
--</div>
</div>
<div style="display: flex; flex-direction: column; gap: 0.5rem;">
<!-- Classes -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Classes</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-shrinking-classes-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-shrinking-classes-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Fields -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Fields</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-shrinking-fields-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-shrinking-fields-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Methods -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Methods</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-shrinking-methods-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-shrinking-methods-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
</div>
</div>
<!-- Optimization Card -->
<div class="stat-card"
style="background: #ffffff; padding: 1rem; border-radius: 0.5rem; border: 1px solid var(--border-color); flex: 1;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
<div style="color: var(--text-muted); font-size: 0.75rem; text-transform: uppercase; font-weight: 600; display: flex; align-items: center; gap: 0.25rem;">
Optimization <span class="tooltip-icon" data-tooltip="Optimization score tracks the number of classes, fields and methods optimized by R8 through techniques such as method inlining, class merging to the total number of classes in the codebase. These optimizations improve the performance and size of the app.">?</span></div>
<div id="card-total-optimization" style="font-size: 1rem; font-weight: 700; color: var(--text-yellow-600);">
--</div>
</div>
<div style="display: flex; flex-direction: column; gap: 0.5rem;">
<!-- Classes -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Classes</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-optimization-classes-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-optimization-classes-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Fields -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Fields</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-optimization-fields-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-optimization-fields-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Methods -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Methods</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-optimization-methods-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-optimization-methods-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
</div>
</div>
<!-- Obfuscation Card -->
<div class="stat-card"
style="background: #ffffff; padding: 1rem; border-radius: 0.5rem; border: 1px solid var(--border-color); flex: 1;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
<div style="color: var(--text-muted); font-size: 0.75rem; text-transform: uppercase; font-weight: 600; display: flex; align-items: center; gap: 0.25rem;">
Obfuscation <span class="tooltip-icon" data-tooltip="Obfuscation Score measures the percentage of symbols renamed within your codebase. By tracking this score, you can gauge the effectiveness of R8's obfuscation, which is crucial for reducing your application's metadata footprint to save memory">?</span></div>
<div id="card-total-obfuscation" style="font-size: 1rem; font-weight: 700; color: var(--text-yellow-600);">
--</div>
</div>
<div style="display: flex; flex-direction: column; gap: 0.5rem;">
<!-- Classes -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Classes</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-obfuscation-classes-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-obfuscation-classes-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Fields -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Fields</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-obfuscation-fields-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-obfuscation-fields-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
<!-- Methods -->
<div style="display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem;">
<span style="color: var(--text-gray-500); width: 60px;">Methods</span>
<div style="flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; margin: 0 1rem;">
<div id="card-obfuscation-methods-bar"
style="height: 100%; background: var(--text-yellow-600); border-radius: 2px; width: 0%;"></div>
</div>
<span id="card-obfuscation-methods-val" style="color: var(--text-gray-900); font-weight: 500;">--</span>
</div>
</div>
</div>
</div>
<div class="breadcrumb-row"
style="display: flex; flex-direction: column; align-items: start; margin-bottom: 1.5rem; gap: 0.25rem; height: auto;">
<span class="breadcrumb-text" style="font-size: 0.875rem; font-weight: 600; color: var(--text-gray-900);">Keep Rule Analysis</span>
<div style="font-size: 0.75rem; color: var(--text-gray-500); font-weight: 400; text-transform: none; letter-spacing: normal; line-height: 1.4; padding: 0rem 0.5rem;">
Keep rules prevent R8 from optimizing designated code segments. Review the list below to identify and refine overly broad rules, which will directly improve overall application performance.
</div>
</div>
<div class="table-container">
<table id="main-table">
<thead id="table-headers"></thead>
<tbody id="table-data"></tbody>
</table>
</div>
</main>
</div>
<div id="details-view" class="container-custom" style="display: none">
<main>
<div class="breadcrumb-row" style="margin-bottom: 2rem; height: auto;">
<div id="details-breadcrumbs"></div>
</div>
<div
style="flex: 1; display: flex; flex-direction: column; gap: 1.5rem; min-height: 0; overflow-y: auto; padding-right: 0.5rem;">
<div class="table-container" style="flex: none;">
<div
style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; justify-content: space-between; align-items: center;">
<h2 style="font-size: 0.875rem; font-weight: 500; color: var(--text-gray-900);">Keep Rule</h2>
</div>
<div id="details-rule-container" style="padding: 1rem;">
<!-- Content rendered by JS -->
</div>
</div>
<div class="table-container" style="flex: none;">
<div
style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; justify-content: space-between; align-items: center;">
<h2 style="font-size: 0.875rem; font-weight: 500; color: var(--text-gray-900);">Impact</h2>
</div>
<div id="details-impact-container" style="padding: 1rem;">
<!-- Content rendered by JS -->
</div>
</div>
<div id="related-rules-container" style="flex: none;">
<!-- Content rendered by JS -->
</div>
<div
style="flex: 1; display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1.5rem; min-height: 400px; overflow: hidden;">
<div class="table-container" style="display: flex; flex-direction: column;">
<div
style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; flex-direction: column; gap: 0.5rem;">
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
<div>
<span style="font-size: 0.875rem; font-weight: 600; color: var(--text-gray-900);">Kept Classes</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem; margin-left: 0.25rem;"
id="details-classes-count">· 0</span>
</div>
<button class="icon-btn search-toggle-btn" data-target="classes" style="color: var(--text-muted); padding: 2px;">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
</button>
</div>
<div id="classes-search-container" style="display: none; width: 100%;">
<input type="text" id="classes-search-input" placeholder="Search kept classes..."
style="width: 100%; padding: 0.25rem 0.5rem; border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.75rem; outline: none; background-color: var(--bg-body); color: var(--text-main);">
</div>
</div>
<div id="details-classes-content" style="flex: 1; overflow-y: auto; padding: 0.5rem;"></div>
</div>
<div class="table-container" style="display: flex; flex-direction: column;">
<div
style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; flex-direction: column; gap: 0.5rem;">
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
<div>
<span style="font-size: 0.875rem; font-weight: 600; color: var(--text-gray-900);">Kept Fields</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem; margin-left: 0.25rem;"
id="details-fields-count">· 0</span>
</div>
<button class="icon-btn search-toggle-btn" data-target="fields" style="color: var(--text-muted); padding: 2px;">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
</button>
</div>
<div id="fields-search-container" style="display: none; width: 100%;">
<input type="text" id="fields-search-input" placeholder="Search kept fields..."
style="width: 100%; padding: 0.25rem 0.5rem; border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.75rem; outline: none; background-color: var(--bg-body); color: var(--text-main);">
</div>
</div>
<div id="details-fields-content" style="flex: 1; overflow-y: auto; padding: 0.5rem;"></div>
</div>
<div class="table-container" style="display: flex; flex-direction: column;">
<div
style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; flex-direction: column; gap: 0.5rem;">
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
<div>
<span style="font-size: 0.875rem; font-weight: 600; color: var(--text-gray-900);">Kept Methods</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem; margin-left: 0.25rem;"
id="details-methods-count">· 0</span>
</div>
<button class="icon-btn search-toggle-btn" data-target="methods" style="color: var(--text-muted); padding: 2px;">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
</button>
</div>
<div id="methods-search-container" style="display: none; width: 100%;">
<input type="text" id="methods-search-input" placeholder="Search kept methods..."
style="width: 100%; padding: 0.25rem 0.5rem; border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.75rem; outline: none; background-color: var(--bg-body); color: var(--text-main);">
</div>
</div>
<div id="details-methods-content" style="flex: 1; overflow-y: auto; padding: 0.5rem;"></div>
</div>
</div>
</div>
</main>
</div>
<div id="file-details-view" class="container-custom" style="display: none">
<main>
<div class="breadcrumb-row" style="margin-bottom: 2rem; height: auto;">
<div id="file-details-breadcrumbs"></div>
</div>
<div
style="flex: 1; display: flex; flex-direction: column; gap: 1.5rem; min-height: 0; overflow-y: auto; padding-right: 0.5rem;">
<div class="table-container" style="flex: none;">
<div
style="padding: 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-gray-50);">
<h2 style="font-size: 1rem; font-weight: 700;">Impact</h2>
</div>
<table style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th class="text-center text-xs font-medium text-gray-500 border-b border-gray-200"
style="padding: 0.75rem 0.5rem; text-transform: uppercase;">
Kept Classes
</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-b border-gray-200"
style="padding: 0.75rem 0.5rem; text-transform: uppercase;">
Kept fields
</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-b border-gray-200"
style="padding: 0.75rem 0.5rem; text-transform: uppercase;">
Kept methods
</th>
</tr>
</thead>
<tbody id="file-details-impact-body"></tbody>
</table>
</div>
<div class="table-container" style="flex: 1; display: flex; flex-direction: column;">
<div
style="padding: 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-gray-50);">
<h2 style="font-size: 1rem; font-weight: 700;">Keep Rules</h2>
</div>
<div style="flex: 1; overflow-y: auto;">
<table style="width: 100%; border-collapse: collapse;">
<thead id="file-details-rules-header">
<tr>
<th rowspan="2" class="text-left bg-gray-50 z-30"
style="padding: 1rem; width: 600px; min-width: 600px; border-bottom: 1px solid var(--border-color);">
Rule
</th>
<th colspan="4" class="text-center border-l border-gray-200 bg-gray-50"
style="padding: 0.5rem; border-bottom: 1px solid var(--border-color);">
Kept Items <span style="color: var(--text-muted);text-transform: none;font-weight: 500;">Higher is
worse</span>
</th>
<th rowspan="2" colspan="3" class="text-center border-l border-gray-200 bg-gray-50"
style="padding: 0.5rem; width: 150px; min-width: 150px; border-bottom: 1px solid var(--border-color);">
Steps blocked by rule
</th>
</tr>
<tr>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200"
style="padding: 0.5rem; width: 100px; min-width: 100px; border-bottom: 1px solid var(--border-color);">
Total
</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200"
style="padding: 0.5rem; width: 100px; min-width: 100px; border-bottom: 1px solid var(--border-color);">
Classes
</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200"
style="padding: 0.5rem; width: 100px; min-width: 100px; border-bottom: 1px solid var(--border-color);">
Fields
</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200"
style="padding: 0.5rem; width: 100px; min-width: 100px; border-bottom: 1px solid var(--border-color);">
Methods
</th>
</tr>
</thead>
<tbody id="file-details-rules-body"></tbody>
</table>
</div>
</div>
</div>
</main>
</div>
<script id="keepradius-proto" type="text/plain">// Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
syntax = "proto3";
package com.android.tools.r8.keepradius.proto;
// Don't put all messages under the outer class.
option java_multiple_files = true;
// Camel-case the outer class name.
option java_outer_classname = "KeepRadiusProtos";
// Java package consistent with R8 convention.
option java_package = "com.android.tools.r8.keepradius.proto";
// Information about a single keep rule and its immediate keep radius.
message KeepRuleKeepRadius {
int32 id = 1;
// Textual representation of the keep rule.
string source = 2;
// What this keep rule prohibits (e.g., optimization).
// Id into KeepConstraints.
int32 constraints_id = 3;
// Where this rule comes from.
TextFileOrigin origin = 4;
// Keep radius information.
KeepRadius keep_radius = 5;
// Keep rule tags.
repeated KeepRuleTag tags = 6;
}
enum KeepRuleTag {
PACKAGE_WIDE = 0;
}
message KeepRadius {
// Which rules subsume this rule. Note: This information could in principle
// be computed offline using the kept_by info of Kept*Info.
// Ids into KeepAnnotationKeepRadius and KeepRuleKeepRadius.
repeated int32 subsumed_by = 1;
// The immediate keep radius of this rule.
// - Ids into KeptClassInfo.
repeated int32 class_keep_radius = 2;
// - Ids into KeptFieldInfo.
repeated int32 field_keep_radius = 3;
// - Ids into KeptMethodInfo.
repeated int32 method_keep_radius = 4;
}
// The ids of GlobalKeepRuleKeepRadius and KeepRuleKeepRadius are
// non-overlapping by design, so that a single int32 id can be used to
// unambiguously reference a GlobalKeepRuleKeepRadius or KeepRuleKeepRadius.
message GlobalKeepRuleKeepRadius {
int32 id = 1;
// Textual representation of the keep rule.
string source = 2;
// Where this rule comes from.
TextFileOrigin origin = 3;
}
// Information about the constraints of a single keep annotation or rule,
// i.e., what is prohibited by it.
//
// This is encoded as a message to support keep constraints that cannot be
// encoded as a bit in the future.
message KeepConstraints {
int32 id = 1;
repeated KeepConstraint constraints = 2;
}
enum KeepConstraint {
DONT_OBFUSCATE = 0;
DONT_OPTIMIZE = 1;
DONT_SHRINK = 2;
}
// Information about a class in the app/library and which keep rules that
// keep it.
message KeptClassInfo {
int32 id = 1;
// Id into TypeReference.
int32 class_reference_id = 2;
// Id into FileOrigin or ClassFileInJarOrigin.
int32 file_origin_id = 3;
// Ids into KeepRuleKeepRadius, telling which rules keep this class.
// Allows reasoning about properties such as:
// - Which keep rules are fully subsumed by other keep rules?
// - Which keep rules keep the most classes/fields/methods
// not kept by rules?
repeated int32 kept_by = 4;
}
message KeptFieldInfo {
int32 id = 1;
// Id into FieldReference.
int32 field_reference_id = 2;
// Id into FileOrigin or ClassFileInJarOrigin.
int32 file_origin_id = 3;
// Ids into KeepRuleKeepRadius, telling which rules keep this field.
repeated int32 kept_by = 4;
}
message KeptMethodInfo {
int32 id = 1;
// Id into MethodReference.
int32 method_reference_id = 2;
// Id into FileOrigin or ClassFileInJarOrigin.
int32 file_origin_id = 3;
// Ids into KeepRuleKeepRadius, telling which rules keep this method.
repeated int32 kept_by = 4;
}
// References:
message FieldReference {
int32 id = 1;
// The class on which the field is declared.
// Id into TypeReference.
int32 class_reference_id = 2;
// The type of the field.
// Id into type reference.
int32 type_reference_id = 3;
// The name of the field.
string name = 4;
}
message MethodReference {
int32 id = 1;
// The class on which the method is declared.
// Id into TypeReference.
int32 class_reference_id = 2;
// The proto (return type, parameter types) of the method.
// Id into ProtoReference.
int32 proto_reference_id = 3;
// The name of the method.
string name = 4;
}
message ProtoReference {
int32 id = 1;
// Id into TypeReferenceList.
int32 parameters_id = 2;
// Id into TypeReference.
int32 return_type_id = 3;
}
message TypeReference {
int32 id = 1;
// The descriptor, e.g.,
// - Z
// - Ljava/lang/Object;
// - [[Ljava/lang/Object;
string java_descriptor = 2;
}
message TypeReferenceList {
int32 id = 1;
repeated int32 type_reference_ids = 2;
}
// Origins:
message FileOrigin {
int32 id = 1;
string filename = 2;
MavenCoordinate maven_coordinate = 3;
bool provided_by_build_system = 4;
}
// The ids of ClassFileInJarOrigin and FileOrigin are non-overlapping
// by design, so that a single int32 id can be used to
// unambiguously reference a ClassFileInJarOrigin or FileOrigin.
message ClassFileInJarOrigin {
int32 id = 1;
int32 file_origin_id = 2;
string entry = 3;
}
// Intentionally doesn't declare an id since each keep rule has its own
// TextFileOrigin, i.e., there is no sharing of TextFileOrigin.
message TextFileOrigin {
// Id into FileOrigin
int32 file_origin_id = 1;
int32 line_number = 2;
int32 column_number = 3;
}
message MavenCoordinate {
int32 id = 1;
string group_id = 2;
string artifact_id = 3;
string version = 4;
}
message BuildInfo {
int32 class_count = 1;
int32 field_count = 2;
int32 method_count = 3;
int32 live_class_count = 4;
int32 live_field_count = 5;
int32 live_method_count = 6;
}
// Container.
message KeepRadiusContainer {
// Origins.
repeated FileOrigin file_origin_table = 1;
repeated ClassFileInJarOrigin class_file_in_jar_origin_table = 2;
repeated MavenCoordinate maven_coordinate_table = 3;
// References.
repeated FieldReference field_reference_table = 4;
repeated MethodReference method_reference_table = 5;
repeated ProtoReference proto_reference_table = 6;
repeated TypeReference type_reference_table = 7;
repeated TypeReferenceList type_reference_list_table = 8;
// Kept items.
repeated KeptClassInfo kept_class_info_table = 9;
repeated KeptFieldInfo kept_field_info_table = 10;
repeated KeptMethodInfo kept_method_info_table = 11;
// Keep specifications.
repeated KeepConstraints keep_constraints_table = 12;
repeated KeepRuleKeepRadius keep_rule_keep_radius_table = 13;
repeated GlobalKeepRuleKeepRadius global_keep_rule_keep_radius_table = 14;
// Build info.
BuildInfo build_info = 15;
}
</script>
<script id="keepradius-data" type="application/octet-stream">CnwSei9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy80YWM1ZjVlYjFhNjI2YzA0YjVkZGRiY2Y3MWVkMDEzYS90cmFuc2Zvcm1lZC9uYXZpZ2F0aW9uMy1ydW50aW1lLXJ1bnRpbWUuamFyCnUIARJxL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2U3MDYyZWI0MmZlYTk2YWZlZWFiYTlmZDQyN2UyMWJiL3RyYW5zZm9ybWVkL3NhdmVkc3RhdGUtcnVudGltZS5qYXIKaggCEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMGJlODJkNjJiMjY1ODZlNmEwNGVkNDVjYTdiZmU2Y2IvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKaggDEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNDE0OTgzZDBmMDc0MDRhNmI3ODNjMTI0ZTFkMTRhZDUvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKaggEEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYzUwYTE0NjFkYTFlNzM3MzFjMTNjZjIxYzQ3MjhhZjkvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKaggFEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvOWE4NTBkMDM5OGM0ZWNjMGE2MTYxZjA1OGFiNTNhM2MvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKaggGEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZGIxYmM5N2FhZWE1ZGNiOGZkZGMzNDdkNDljNDM5MWIvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKaggHEmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZjJlZjg2NTc5NzdiZjdiMDZkNThlMTk0ODk0YjYxOTIvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKfQgIEnkvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYzI5NTBkNzBlNDY0NDM1MGEzZDBmMDY0OWIyMjRkZDEvdHJhbnNmb3JtZWQva290bGlueC1kYXRldGltZS1qdm0tMC42LjEuamFyCogBCAkSgwEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNTM4YTFiNmYzNzVlOTIwNzM1ZmNiOGVhOGMzZjIxMWEvdHJhbnNmb3JtZWQva290bGlueC1zZXJpYWxpemF0aW9uLWpzb24tanZtLTEuOC4wLmphcgqrAQgKEqYBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzdhMTljYWI1ZWIyNTA4ODBhNWY5MDQxMjhkZmZmYTkwL3RyYW5zZm9ybWVkL3Nocmluay1ydWxlcy9saWIvTUVUQS1JTkYvY29tLmFuZHJvaWQudG9vbHMvcjgva290bGlueC1zZXJpYWxpemF0aW9uLXI4LnBybwqvAQgLEqoBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzdhMTljYWI1ZWIyNTA4ODBhNWY5MDQxMjhkZmZmYTkwL3RyYW5zZm9ybWVkL3Nocmluay1ydWxlcy9saWIvTUVUQS1JTkYvY29tLmFuZHJvaWQudG9vbHMvcjgva290bGlueC1zZXJpYWxpemF0aW9uLWNvbW1vbi5wcm8KdwgMEnMvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZGU0MjViMzE3M2U2YmU2YmE2Y2RiMDU4NTUwYzVjZTUvdHJhbnNmb3JtZWQvd2luZG93LTEuNS4wLXJ1bnRpbWUuamFyCngIDRJ0L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2IwMGM3OWE3M2U3N2Y4MjgyZmI4NzAzNzE3Yjc5Y2RmL3RyYW5zZm9ybWVkL3dpbmRvdy0xLjUuMC9wcm9ndWFyZC50eHQKkAEIDhKLAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8yN2NlOGQyYjJlZGEzOWM5MDI5ZDgzNjBkYTEwY2E4Ny90cmFuc2Zvcm1lZC9zaHJpbmstcnVsZXMvbGliL01FVEEtSU5GL3Byb2d1YXJkL3JldHJvZml0Mi5wcm8KeQgPEnUvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMDI3YjZhYzIwNzQ0ZDQ5NjE0ZDA2ODljOWRmNDU4NWIvdHJhbnNmb3JtZWQvZnJhZ21lbnQtMS41LjQtcnVudGltZS5qYXIKhQEIEBKAAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9iZjY0N2NmNzQxYmE5YzMxMDJhMTFkMGEwNmZjNGFiYi90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLWJhc2UtMTguNS4wLXJ1bnRpbWUuamFyCokBCBEShAEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvN2UxNzI5NzBjMmZiNDg2NWZmNmI5ZTJkOWM5NjQyNjcvdHJhbnNmb3JtZWQvcGxheS1zZXJ2aWNlcy1iYXNlbWVudC0xOC40LjAtcnVudGltZS5qYXIKeggSEnYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNzkwNjJhMWI3YTZmMmU4NzZhNDExYzc5NzYyODAyMTUvdHJhbnNmb3JtZWQvZnJhZ21lbnQtMS41LjQvcHJvZ3VhcmQudHh0CoYBCBMSgQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZWM4OTA0MzJiMzlkNWViOGNkZmEzMjQwNDMxMDA4ZjYvdHJhbnNmb3JtZWQvbGlmZWN5Y2xlLXJ1bnRpbWUtY29tcG9zZS9wcm9ndWFyZC50eHQKfggUEnovVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvOGIwNTBhZjhmOWI2NWEyNDVkMmQxNmFiYzE5NjA1OWIvdHJhbnNmb3JtZWQvc2F2ZWRzdGF0ZS1jb21wb3NlL3Byb2d1YXJkLnR4dAqIAQgVEoMBL1VzZXJzL2FqZXNoci9TdHVkaW9Qcm9qZWN0cy9ub3dpbmFuZHJvaWQvYXBwL2J1aWxkL2ludGVybWVkaWF0ZXMvZGVmYXVsdF9wcm9ndWFyZF9maWxlcy9nbG9iYWwvcHJvZ3VhcmQtYW5kcm9pZC1vcHRpbWl6ZS50eHQtOS4wLjAKhwEIFhKCAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82YTJjZjM5YTczYjJkYjM4YjAxY2Q3OTgzNDgwMTFlNy90cmFuc2Zvcm1lZC90cmFuc3BvcnQtYmFja2VuZC1jY3QtMy4zLjAtcnVudGltZS5qYXIKgQEIFxJ9L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ZjMDM4MTBmZTRiZmIwOWJlZWZmZjAxZGE1Y2NjZGU0L3RyYW5zZm9ybWVkL2ZpcmViYXNlLWNvbW1vbi0yMS4wLjAtcnVudGltZS5qYXIKfggYEnovVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZTcwMWIzMjdmN2Y1MDFlZDhlMTdhMjE0YWUzMTE3ZWMvdHJhbnNmb3JtZWQvZmlyZWJhc2UtYWJ0LTIxLjEuMS1ydW50aW1lLmphcgqQAQgZEosBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzA0Y2EwMGE0MjUzNjIyODI2NWJkYzFmOTlhNTVkNmFiL3RyYW5zZm9ybWVkL3BsYXktc2VydmljZXMtbWVhc3VyZW1lbnQtYXBpLTIyLjEuMi1ydW50aW1lLmphcgqHAQgaEoIBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzMxZDNiM2JjZjA2ZTU0OTYzNzMxZDIwYzk3Mjk0MDQ3L3RyYW5zZm9ybWVkL2ZpcmViYXNlLWNyYXNobHl0aWNzLTE5LjMuMC1ydW50aW1lLmphcgqJAQgbEoQBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2RlZmY0YWIxNjZkMTk5Mzk1MmRlNzE1NDBlZGFjZmEyL3RyYW5zZm9ybWVkL2ZpcmViYXNlLWRhdGF0cmFuc3BvcnQtMTkuMC4wLXJ1bnRpbWUuamFyCokBCBwShAEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMzkwZTAzN2M3YWM1MTUxODJkZjg2Y2M3ZWI4MjA2OTIvdHJhbnNmb3JtZWQvZmlyZWJhc2UtaW5zdGFsbGF0aW9ucy0xOC4wLjAtcnVudGltZS5qYXIKhgEIHRKBAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8wZmRjYzgxZTVkYmMxODUxZTY1ZmI1MGMxNDI1Yjk0NC90cmFuc2Zvcm1lZC9maXJlYmFzZS1jb21tb24ta3R4LTIxLjAuMC1ydW50aW1lLmphcgqFAQgeEoABL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzA4YTBlNzQzZTM2Y2NiMmE5YTM0OWYzNDYxMjFkYmNjL3RyYW5zZm9ybWVkL2ZpcmViYXNlLW1lc3NhZ2luZy0yNC4xLjAtcnVudGltZS5qYXIKfwgfEnsvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYjQ4OTQyNjI5YjZkMDNhNGE3OTUyMWJkNDJmMDY4MjkvdHJhbnNmb3JtZWQvZmlyZWJhc2UtcGVyZi0yMS4wLjMtcnVudGltZS5qYXIKgQEIIBJ9L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzZiZTc2ZDExNmM0MTNmNTZiMGQ3Yjc0NWIzYTdlYzMyL3RyYW5zZm9ybWVkL2ZpcmViYXNlLWNvbmZpZy0yMi4wLjEtcnVudGltZS5qYXIKggEIIRJ+L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzIxZmQ5NDYyYWRlYWM4ZmM5YTllMzU2NmMyMDM2MTQ0L3RyYW5zZm9ybWVkL2ZpcmViYXNlLXNlc3Npb25zLTIuMC43LXJ1bnRpbWUuamFyCooBCCIShQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZmU4ZjQ3NzZkNTA5MjdhYWE0NjAxNGYzOTYzMGQwZjgvdHJhbnNmb3JtZWQvcGxheS1zZXJ2aWNlcy1iYXNlbWVudC0xOC40LjAvcHJvZ3VhcmQudHh0CpsBCCMSlgEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNDE2Y2UzODMyYTY2ZWFjNmFjYmFjZmY5ZTNhYTUyNTkvdHJhbnNmb3JtZWQvc2hyaW5rLXJ1bGVzL2xpYi9NRVRBLUlORi9wcm9ndWFyZC9hbmRyb2lkeC1hbm5vdGF0aW9ucy5wcm8KkAEIJBKLAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8xMTI5ODU0YTY1NjNkY2EyMGExNWFjYjQ2ZmJiMGYzNi90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLW1lYXN1cmVtZW50LXNkay0yMi4xLjItcnVudGltZS5qYXIKkQEIJRKMAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9hZjQyYTI5ODY1N2YyZDFkY2E5MzFlM2MxZGJkMzc3ZS90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLW1lYXN1cmVtZW50LWJhc2UtMjIuMS4yLXJ1bnRpbWUuamFyCncIJhJzL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzE3ODFhYTJjNmIwMDI2ODBkNTJjZjRkMjlkNWRiYjFhL3RyYW5zZm9ybWVkL2Fubm90YXRpb24tanZtLTEuOS4xLmphcgp+CCcSei9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy80MjFhMDljMzgwYTdlNmRiNmMzNjNiMjYxYmVlMDYxMC90cmFuc2Zvcm1lZC93b3JrLXJ1bnRpbWUtMi4xMC4wLXJ1bnRpbWUuamFyCmoIKBJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzVmMGM3YTJmODdkMjQ0ZjQxZGU3OWFjZTFmNTQyOTVjL3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCngIKRJ0L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzhjNWEwYjM5ZGJmMzY5OTZhNGJkMzAwNTlhNTIxM2QxL3RyYW5zZm9ybWVkL3Jvb20tcnVudGltZS9wcm9ndWFyZC50eHQKiQEIKhKEAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy81YmEyZjIyOTM4NjgyZmUwOTc3NDBlODkzMTY4OTA4Mi90cmFuc2Zvcm1lZC9ydW50aW1lLXRyYWNpbmctMS4xMC4wLWJldGEwMi1ydW50aW1lLmphcgp3CCsScy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82ZWRiN2EyMzAxODc0Y2UxMTBhMWNjZTUwNTcwNTM1NC90cmFuc2Zvcm1lZC9lbW9qaTItMS40LjAtcnVudGltZS5qYXIKgwEILBJ/L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2U5MWM2MWFjODBmZWZjOGIxM2MzNDI4YTIxMWNjZTkzL3RyYW5zZm9ybWVkL2xpZmVjeWNsZS1wcm9jZXNzLTIuMTAuMC1ydW50aW1lLmphcgqBAQgtEn0vVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZTdiZmQ3NmQ5NzUyNzU5YjUwM2JiMWY5MDVjYTBhMTEvdHJhbnNmb3JtZWQvcHJvZmlsZWluc3RhbGxlci0xLjQuMS1ydW50aW1lLmphcgqBAQguEn0vVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMWJkZTEyNWY1NDJmNGU4ZmM0NzA0NmIzNWY5NjA5YmUvdHJhbnNmb3JtZWQvdHJhY2luZy1wZXJmZXR0by0xLjAuMC1ydW50aW1lLmphcgqBAQgvEn0vVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNmMyYzU0N2ZhY2NiZWM3OGJmYzA1NTk1ODIwZjlkODMvdHJhbnNmb3JtZWQvc3RhcnR1cC1ydW50aW1lLTEuMS4xL3Byb2d1YXJkLnR4dAp9CDASeS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82ZDQ2ZDVkNzRmNGZkMWJmZGMzYmQ3YjQ1M2NmZTRmYy90cmFuc2Zvcm1lZC9saWZlY3ljbGUtcnVudGltZS9wcm9ndWFyZC50eHQKdggxEnIvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvODJjMmExMTc3ODRkMDViYzdmODBlNDkzNWY3ZmQyZTQvdHJhbnNmb3JtZWQvY29yZS0xLjE2LjAtcnVudGltZS5qYXIKhQEIMhKAAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy84M2QxZTUwMDczZThhOThmMTk2ZTJkOWJjYmJkZGQyMi90cmFuc2Zvcm1lZC92ZXJzaW9uZWRwYXJjZWxhYmxlLTEuMS4xLXJ1bnRpbWUuamFyCoYBCDMSgQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYjI4ODRhZTJjNTUzN2EyMGM5NDkwNTIzNmU1NTU1MjAvdHJhbnNmb3JtZWQvdmVyc2lvbmVkcGFyY2VsYWJsZS0xLjEuMS9wcm9ndWFyZC50eHQKvAEINBK3AS9Vc2Vycy9hamVzaHIvU3R1ZGlvUHJvamVjdHMvbm93aW5hbmRyb2lkL2FwcC9idWlsZC9pbnRlcm1lZGlhdGVzL2NsYXNzZXMvcHJvZFJlbGVhc2UvdHJhbnNmb3JtUHJvZFJlbGVhc2VDbGFzc2VzV2l0aEFzbS9kaXJzL2NvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9OaWFTdGFydHVwVGFzay5jbGFzcwqfAQg1EpoBL1VzZXJzL2FqZXNoci9TdHVkaW9Qcm9qZWN0cy9ub3dpbmFuZHJvaWQvbXlsaWJyYXJ5L2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3JlbGVhc2UvZXhwb3J0UmVsZWFzZUNvbnN1bWVyUHJvZ3VhcmRGaWxlcy9saWIwL3Byb2d1YXJkLnR4dAqHAQg2EoIBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzhlYWYwYjk3OTgxZTBiZjUwZmNkNzIxYTA1NTQ5YTY3L3RyYW5zZm9ybWVkL2ZpcmViYXNlLWNvbXBvbmVudHMtMTguMC4wL3Byb2d1YXJkLnR4dAp/CDcSey9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mYjgxOTQxNTAyMjM2MzExYmFiZDYyYjRmYzVkOTk4NS90cmFuc2Zvcm1lZC93b3JrLXJ1bnRpbWUtMi4xMC4wL3Byb2d1YXJkLnR4dApqCDgSZi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8wZmFkNzEwMDkwMGNhZmY3MzA5ZTRiODI1OWE3N2EzZi90cmFuc2Zvcm1lZC9jbGFzc2VzLmphcgp8CDkSeC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy83ZTE3ZTRlNzYxNDA2ZGQ1YTJlZmE1MjJiZTI5ZTY2MC90cmFuc2Zvcm1lZC9oaWx0LWFuZHJvaWQtMi41OS1ydW50aW1lLmphcgp9CDoSeS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mMjQzODZlN2NkYTU0NDYwNDQ2YjVhNzg0M2Y2Mjg4OS90cmFuc2Zvcm1lZC9oaWx0LWFuZHJvaWQtMi41OS9wcm9ndWFyZC50eHQKzAEIOxLHAS9Vc2Vycy9hamVzaHIvU3R1ZGlvUHJvamVjdHMvbm93aW5hbmRyb2lkL2FwcC9idWlsZC9pbnRlcm1lZGlhdGVzL2NsYXNzZXMvcHJvZFJlbGVhc2UvdHJhbnNmb3JtUHJvZFJlbGVhc2VDbGFzc2VzV2l0aEFzbS9kaXJzL2NvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9NYWluQWN0aXZpdHlfR2VuZXJhdGVkSW5qZWN0b3IuY2xhc3MKzgEIPBLJAS9Vc2Vycy9hamVzaHIvU3R1ZGlvUHJvamVjdHMvbm93aW5hbmRyb2lkL2FwcC9idWlsZC9pbnRlcm1lZGlhdGVzL2NsYXNzZXMvcHJvZFJlbGVhc2UvdHJhbnNmb3JtUHJvZFJlbGVhc2VDbGFzc2VzV2l0aEFzbS9kaXJzL2NvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9OaWFBcHBsaWNhdGlvbl9HZW5lcmF0ZWRJbmplY3Rvci5jbGFzcwp0CD0ScC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy84MTgyMWZkM2JkOGE4NjNkYjc2NTM4YWQxNTk4YTdkZS90cmFuc2Zvcm1lZC9hbmltYXRpb24tcnVudGltZS5qYXIKdQg+EnEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYTAxNzViM2VjNjRkODExYTdlN2IwMzY5NTUzNzRiZjUvdHJhbnNmb3JtZWQvZm91bmRhdGlvbi1ydW50aW1lLmphcgp8CD8SeC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8xNmJmMDc0NGQzN2E0YTUwYmIzY2Q3MTI4MWI2NDFhYi90cmFuc2Zvcm1lZC9mb3VuZGF0aW9uLWxheW91dC1ydW50aW1lLmphcgp0CEAScC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy85MjNmYjlmYjY1MzQ1MGY5ZjU4MjZlYjNkMjQ0ZjhmYi90cmFuc2Zvcm1lZC9tYXRlcmlhbDMtcnVudGltZS5qYXIKeghBEnYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZTZlOWU4MDk2NzU0Mjk5MDFhY2RkZmUyOWQ4NTg4ZWUvdHJhbnNmb3JtZWQvYWRhcHRpdmUtbGF5b3V0LXJ1bnRpbWUuamFyCm0IQhJpL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ExODk4ZDAwOGY0NjgyMWYyYjljN2I3MTdmZTg5NzIwL3RyYW5zZm9ybWVkL3VpLXJ1bnRpbWUuamFyCmoIQxJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzNkNzIyMmEyNTBiYzJkYzU5ZDA0OGU2MWUwNDBmMjU3L3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCm4IRBJqL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ViMzVmN2QzNDYyMjg4N2NkZjY2ZWI2OTZmYzc0NTA3L3RyYW5zZm9ybWVkL3VpL3Byb2d1YXJkLnR4dArDAQhFEr4BL1VzZXJzL2FqZXNoci9TdHVkaW9Qcm9qZWN0cy9ub3dpbmFuZHJvaWQvYXBwL2J1aWxkL2ludGVybWVkaWF0ZXMvY2xhc3Nlcy9wcm9kUmVsZWFzZS90cmFuc2Zvcm1Qcm9kUmVsZWFzZUNsYXNzZXNXaXRoQXNtL2RpcnMvY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL01haW5BY3Rpdml0eVZpZXdNb2RlbC5jbGFzcwqeAQhGEpkBL1VzZXJzL2FqZXNoci9TdHVkaW9Qcm9qZWN0cy9ub3dpbmFuZHJvaWQvYXBwL2J1aWxkL2ludGVybWVkaWF0ZXMvZ2VuZXJhdGVkX3Byb2d1YXJkX2ZpbGUvcHJvZFJlbGVhc2UvbWVyZ2VQcm9kUmVsZWFzZUdlbmVyYXRlZFByb2d1YXJkRmlsZXMvcHJvZ3VhcmQudHh0CmoIRxJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ZlZmE0ZTM0ODA1Yjk3MWRlZTI4NTY1ODc3NDE3ZWU3L3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCrQBCEgSrwEvVXNlcnMvYWplc2hyL1N0dWRpb1Byb2plY3RzL25vd2luYW5kcm9pZC9mZWF0dXJlL2Jvb2ttYXJrcy9pbXBsL2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3Byb2RSZWxlYXNlL2V4cG9ydFByb2RSZWxlYXNlQ29uc3VtZXJQcm9ndWFyZEZpbGVzL2xpYjAvcHJvZ3VhcmQudHh0CmoISRJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzFhYzYzYTA1YWVmOGM3YTQzODE5Mjk0MzAyMGRmYzI4L3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCrEBCEoSrAEvVXNlcnMvYWplc2hyL1N0dWRpb1Byb2plY3RzL25vd2luYW5kcm9pZC9mZWF0dXJlL2ZvcnlvdS9pbXBsL2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3Byb2RSZWxlYXNlL2V4cG9ydFByb2RSZWxlYXNlQ29uc3VtZXJQcm9ndWFyZEZpbGVzL2xpYjAvcHJvZ3VhcmQudHh0CmoISxJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2RiNjNmNTBiNjZiYThhMDc0MzcwOTU2YTc0M2Q4ODA1L3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCrQBCEwSrwEvVXNlcnMvYWplc2hyL1N0dWRpb1Byb2plY3RzL25vd2luYW5kcm9pZC9mZWF0dXJlL2ludGVyZXN0cy9pbXBsL2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3Byb2RSZWxlYXNlL2V4cG9ydFByb2RSZWxlYXNlQ29uc3VtZXJQcm9ndWFyZEZpbGVzL2xpYjAvcHJvZ3VhcmQudHh0CmoITRJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzJiYThkNjVlMzk4N2IxOTVkODMzN2E4MTQ0MGJhOWNhL3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCrEBCE4SrAEvVXNlcnMvYWplc2hyL1N0dWRpb1Byb2plY3RzL25vd2luYW5kcm9pZC9mZWF0dXJlL3NlYXJjaC9pbXBsL2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3Byb2RSZWxlYXNlL2V4cG9ydFByb2RSZWxlYXNlQ29uc3VtZXJQcm9ndWFyZEZpbGVzL2xpYjAvcHJvZ3VhcmQudHh0CmoITxJmL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ZhNTQ1NzQ2YjNlZDhiMmM3MzQ0OTRmYjI4MzIzYjQ4L3RyYW5zZm9ybWVkL2NsYXNzZXMuamFyCrMBCFASrgEvVXNlcnMvYWplc2hyL1N0dWRpb1Byb2plY3RzL25vd2luYW5kcm9pZC9mZWF0dXJlL3NldHRpbmdzL2ltcGwvYnVpbGQvaW50ZXJtZWRpYXRlcy9jb25zdW1lcl9wcm9ndWFyZF9kaXIvcHJvZFJlbGVhc2UvZXhwb3J0UHJvZFJlbGVhc2VDb25zdW1lclByb2d1YXJkRmlsZXMvbGliMC9wcm9ndWFyZC50eHQKaghREmYvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZjk4MTRhOWU5NWIyZTllYWVhZmM3NjBkMGRhZTkxOTQvdHJhbnNmb3JtZWQvY2xhc3Nlcy5qYXIKsAEIUhKrAS9Vc2Vycy9hamVzaHIvU3R1ZGlvUHJvamVjdHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvdG9waWMvaW1wbC9idWlsZC9pbnRlcm1lZGlhdGVzL2NvbnN1bWVyX3Byb2d1YXJkX2Rpci9wcm9kUmVsZWFzZS9leHBvcnRQcm9kUmVsZWFzZUNvbnN1bWVyUHJvZ3VhcmRGaWxlcy9saWIwL3Byb2d1YXJkLnR4dAp2CFMSci9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy85YTJmZDViYjc2NjczMDhlN2FhMzQ3ZTJmNjgwODc3Yi90cmFuc2Zvcm1lZC9rb3RsaW4tc3RkbGliLTIuMy4wLmphcgpyCFQSbi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8zYjBmNzAxYThlNTJmMzdkZDExMGZmNDI2Yjc1ZjAzMi90cmFuc2Zvcm1lZC9yZXRyb2ZpdC0yLjExLjAuamFyCoYBCFUSgQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNjUzYjRiODQwMDdhMzljNDM3ZGMxMmNiMDg0YzQwYTUvdHJhbnNmb3JtZWQvZmlyZWJhc2UtY29tcG9uZW50cy0xOC4wLjAtcnVudGltZS5qYXIKfghWEnovVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMWY5N2YyMjNiOGExMDVkNmM0MjFkYjM1NjJiYmQwNjQvdHJhbnNmb3JtZWQvZ3JhcGhpY3MtcGF0aC0xLjAuMS1ydW50aW1lLmphcgp6CFcSdi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy81NWU3YjBmYzI3NzU4OTJlN2ZjMjNmYmQ5M2VhODViNC90cmFuc2Zvcm1lZC9kYXRhc3RvcmUtY29yZS9wcm9ndWFyZC50eHQKkQEIWBKMAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8yMDA0MmQ1YWM3Y2JhNDJkZWJjOTAwOTg3NzNmZDg3OS90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLW1lYXN1cmVtZW50LWltcGwtMjIuMS4yLXJ1bnRpbWUuamFyCn8IWRJ7L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2E3NGFiNGRlMmQ0MTVjYzQxNzBiZmE1N2MxNzM3ZTFmL3RyYW5zZm9ybWVkL2dyYXBoaWNzLXBhdGgtMS4wLjEvcHJvZ3VhcmQudHh0CnwIWhJ4L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzBhMzE1YThiMTM3M2Q1ZTE1NTdjOTJkY2Q0OGY5NjY2L3RyYW5zZm9ybWVkL2xpZmVjeWNsZS1ydW50aW1lLXJ1bnRpbWUuamFyCnoIWxJ2L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzVkNDBmMTExNjM2OGI3ZmIyNDk1YjlhNjQ0MzNiYzJjL3RyYW5zZm9ybWVkL2FwcGNvbXBhdC0xLjcuMC1ydW50aW1lLmphcgp7CFwSdy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy81ZjlmNDI2MmZkOTI0NjNlZDczZTZjNWZlZTlhZDk5NS90cmFuc2Zvcm1lZC9hcHBjb21wYXQtMS43LjAvcHJvZ3VhcmQudHh0CncIXRJzL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzFjNzhjMDFkOTU3YmNmMTUxM2E4MmFiNTQxMTE1NDA2L3RyYW5zZm9ybWVkL2NvcmUtMS4xNi4wL3Byb2d1YXJkLnR4dAp6CF4Sdi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mM2FkNTMxMzA2NzdhNzhjNDZiM2YwMDVhY2FlOGFiYS90cmFuc2Zvcm1lZC9hY3Rpdml0eS0xLjEyLjAtcnVudGltZS5qYXIKhQEIXxKAAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy80MjQ4ODQzZWY3YjRiNjc3Yzc5NzRhOGUyOWMxZDZhZS90cmFuc2Zvcm1lZC9kYXRhc3RvcmUtcHJlZmVyZW5jZXMtcHJvdG8tMS4yLjAuamFyCpEBCGASjAEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNDkxMjE3MTQ4NmUwMDg0YTQ4YTU4NWY3YTNmNWVkMzIvdHJhbnNmb3JtZWQvZGF0YXN0b3JlLXByZWZlcmVuY2VzLWV4dGVybmFsLXByb3RvYnVmLTEuMi4wLmphcgqHAQhhEoIBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzc2OWE1YWU3YWNkNWE4NjA2ZWJhODZlNjBjOTBjMzFlL3RyYW5zZm9ybWVkL2RhdGFzdG9yZS1wcmVmZXJlbmNlcy1jb3JlL3Byb2d1YXJkLnR4dAqFAQhiEoABL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2JkYTEyMmMwMmZkOTNmZGI0ZmQwYmYxMjgyYTdkMjMzL3RyYW5zZm9ybWVkL2xpZmVjeWNsZS1wcm9jZXNzLTIuMTAuMC9wcm9ndWFyZC50eHQKjAEIYxKHAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8yMzRmMTRlYzRlZTI3NzNiNDQ4MmQ0YjhmZWVhZGY4YS90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLW1lYXN1cmVtZW50LTIyLjEuMi1ydW50aW1lLmphcgqNAQhkEogBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzIxYjBjMTAxZTk2ZTU0NDkwMTZhNGI0YTQ4NWRlYmQyL3RyYW5zZm9ybWVkL3BsYXktc2VydmljZXMtbWVhc3VyZW1lbnQtMjIuMS4yL3Byb2d1YXJkLnR4dAp7CGUSdy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9iZmVhMDhkNGUzN2VkNzA5MDlhMDE0YzAwZTQwNDY1Ny90cmFuc2Zvcm1lZC9wcm90b2J1Zi1qYXZhbGl0ZS00LjI5LjIuamFyCnIIZhJuL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2ZjMzBjZWVjZThhMjQ0Mzk2ZGQwYmM5OTcwMjgzNjA5L3RyYW5zZm9ybWVkL2RhdGFzdG9yZS1wcm90by5qYXIKrAEIZxKnAS9Vc2Vycy9hamVzaHIvU3R1ZGlvUHJvamVjdHMvbm93aW5hbmRyb2lkL2NvcmUvZGF0YXN0b3JlL2J1aWxkL2ludGVybWVkaWF0ZXMvY29uc3VtZXJfcHJvZ3VhcmRfZGlyL3Byb2RSZWxlYXNlL2V4cG9ydFByb2RSZWxlYXNlQ29uc3VtZXJQcm9ndWFyZEZpbGVzL2xpYjAvcHJvZ3VhcmQudHh0CnIIaBJuL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2Q5MWU4NDRmNzZmOTk3Yjk0OWU5OTAyZWU4ZTM3ZDJiL3RyYW5zZm9ybWVkL3J1bnRpbWUtcnVudGltZS5qYXIKewhpEncvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMzUwMDI0ODliNzY3YTFkMjA4ZmNkNzhiMjc4Y2ZiZmIvdHJhbnNmb3JtZWQvY3VzdG9tdmlldy0xLjAuMC1ydW50aW1lLmphcgp6CGoSdi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8zOWQ0ZDFjOTQ3YmIyMmU5ODkxZTZmMDUyOGFmNDkxMy90cmFuc2Zvcm1lZC9jb2lsLWJhc2UtMi43LjAtcnVudGltZS5qYXIKkAEIaxKLAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy81Zjc1OGM1ZGZhOTAyMmRlNWYxMTY4MzMzZTFhNDgxZS90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLWNsb3VkLW1lc3NhZ2luZy0xNy4yLjAtcnVudGltZS5qYXIKjQEIbBKIAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82M2M4YmU2OGIxMWMzNjBmZjAwOTc2ZmZhNDAyN2Y1Ni90cmFuc2Zvcm1lZC9wbGF5LXNlcnZpY2VzLW9zcy1saWNlbnNlcy0xNy4xLjAtcnVudGltZS5qYXIKdwhtEnMvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvYjJkYjZjZjA4NWE2ZTUwMzUwZmQyYWQ1NmMwYjQ2ZDUvdHJhbnNmb3JtZWQvdWktZ3JhcGhpY3MvcHJvZ3VhcmQudHh0CnYIbhJyL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2Q5Yzk4NDhiNjBmMjUyMGM4MTA1NTIyNzJhYjYyNjNhL3RyYW5zZm9ybWVkL3VpLWdyYXBoaWNzLXJ1bnRpbWUuamFyCoIBCG8Sfi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82NDJhNjg3ZGVkN2ZjOGZmNzgwNzU4MzhmOTM5ZTkxNC90cmFuc2Zvcm1lZC90cmFjaW5nLXBlcmZldHRvLTEuMC4wL3Byb2d1YXJkLnR4dAp7CHASdy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9hYjI0YjE3NWQ4Mzk4YmU2MWE0MWFhMmMzMGNjMzE5ZC90cmFuc2Zvcm1lZC90cmFuc2l0aW9uLTEuNi4wLXJ1bnRpbWUuamFyCnwIcRJ4L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2QwYTYwMzZjMTZjZDliYTYxZTZkYTYwNWM2MDQwOTFmL3RyYW5zZm9ybWVkL3RyYW5zaXRpb24tMS42LjAvcHJvZ3VhcmQudHh0Cn8IchJ7L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzk4MjZhNDg3NmU3NTYwNGE2NjQ4M2YwYjk5YTA4ZTYzL3RyYW5zZm9ybWVkL3ZlY3RvcmRyYXdhYmxlLTEuMS4wLXJ1bnRpbWUuamFyCooBCHMShQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvODYzNTJkNGUyMmQ3ODIzYTE2NGY3NDdmMDI3YTRkOWEvdHJhbnNmb3JtZWQvdmVjdG9yZHJhd2FibGUtYW5pbWF0ZWQtMS4xLjAvcHJvZ3VhcmQudHh0CoYBCHQSgQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNzRmYjg3ZmE4MDUxMTY4NTMxZDlkNDZhNjMyMjgxMWEvdHJhbnNmb3JtZWQvcGxheS1zZXJ2aWNlcy1iYXNlLTE4LjUuMC9wcm9ndWFyZC50eHQKnQEIdRKYAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9kNmRhNjgzOGNjZjJiNzljMDA5M2ZkODVjMzRhMDUzNi90cmFuc2Zvcm1lZC9zaHJpbmstcnVsZXMvbGliL01FVEEtSU5GL2NvbS5hbmRyb2lkLnRvb2xzL3I4L2Nvcm91dGluZXMucHJvCoYBCHYSgQEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvN2ExMGExNjgwZmFlZWMxOWJkNzNkNTcyYWRlZjE5OTIvdHJhbnNmb3JtZWQva290bGlueC1jb3JvdXRpbmVzLWNvcmUtanZtLTEuMTAuMS5qYXIKhQEIdxKAAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9iNGFkNTRiOWIwODdlZmJjM2FkNTgzMzhlZDgxMGZmZS90cmFuc2Zvcm1lZC9rb3RsaW54LWNvcm91dGluZXMtYW5kcm9pZC0xLjEwLjEuamFyCnkIeBJ1L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzhiOGM2YjNjYzExOGU4ZjA0ZjIxMTg5MTNlMmZhN2NhL3RyYW5zZm9ybWVkL2FuaW1hdGlvbi1jb3JlLXJ1bnRpbWUuamFyCo8BCHkSigEvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvOTk1ZjRjNzYwZDIzNTA4NjI4NzJlYzc2YzU2MDdlM2QvdHJhbnNmb3JtZWQvbWF0ZXJpYWwzLWFkYXB0aXZlLW5hdmlnYXRpb24tc3VpdGUtcnVudGltZS5qYXIKcgh6Em4vVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMTc1NTIyN2Q4MWFmODBiMThiMTNiMTMzZDEyYTg3MjcvdHJhbnNmb3JtZWQvdWktdGV4dC1ydW50aW1lLmphcgpyCHsSbi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy85NmVlYzYxZjUxZjI3MTViYjdkMGY5YjZkNDcwZjczZC90cmFuc2Zvcm1lZC91aS11bml0LXJ1bnRpbWUuamFyCnsIfBJ3L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zL2QyZTU1YWFmZTFhZjQ1ODdiOTM2YjJiMjViOTY0YzNhL3RyYW5zZm9ybWVkL2NvbmN1cnJlbnQtZnV0dXJlcy0xLjEuMC5qYXIKfgh9EnovVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvNjJhYzRjNGVjMWFmMmEyYzYwODJiOWEwNjk1MTkyNmEvdHJhbnNmb3JtZWQvbGlmZWN5Y2xlLWNvbW1vbi1qdm0tMi4xMC4wLmphcgp3CH4Scy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82NzE2ODRlYzAwMWVkZTk1MWMyMTIzMmQwMjY4ZWIyZS90cmFuc2Zvcm1lZC9sb2FkZXItMS4wLjAtcnVudGltZS5qYXIKdwh/EnMvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZWZmM2I3YTc4MzQxMTQzNGNiMTIyYzBiMTVjNzAyN2IvdHJhbnNmb3JtZWQvcm9vbS1ydW50aW1lLXJ1bnRpbWUuamFyCnwIgAESdy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mNDI0ZDM3YzNmNWI4NjBhMTljMTg3OGFkZDg4YjJmNS90cmFuc2Zvcm1lZC9zcWxpdGUtZnJhbWV3b3JrLXJ1bnRpbWUuamFyCn8IgQESei9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy85NjdkOTVkZWE4YjUwN2QxNThhYTE0ODU0ZWY5ZmU5YS90cmFuc2Zvcm1lZC90cmFuc3BvcnQtYXBpLTMuMi4wLXJ1bnRpbWUuamFyCoMBCIIBEn4vVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMDkwNmEyZTZlNWUzNjQ4MjlkOTllYTdkMTZmYjkxYTMvdHJhbnNmb3JtZWQvdHJhbnNwb3J0LXJ1bnRpbWUtMy4zLjAtcnVudGltZS5qYXIKdgiDARJxL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzBhOGVkNTNiOGYwZjA4YjA5MzQ5MmFmMzZhNGM3ZTI2L3RyYW5zZm9ybWVkL2d1YXZhLTMxLjEtYW5kcm9pZC5qYXIKggEIhAESfS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8zMDAzMWU1Nzc0ZTMyMDlhYTQ0OWFmYWE0YWU5ZWMxOS90cmFuc2Zvcm1lZC9maXJlYmFzZS1lbmNvZGVycy1wcm90by0xNi4wLjAuamFyCmsIhQESZi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy85MjZkOTA5MmVkYTM5MWNkMGZiNDM4ZDczMjQyYWNiNy90cmFuc2Zvcm1lZC9jbGFzc2VzLmphcgppCIYBEmQvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvODZiN2I0YTE3ZmRmY2FjMGIxNTcyNGE1N2Y5MDBlNjcvdHJhbnNmb3JtZWQvbW9kZWwuamFyCnEIhwESbC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9lYTcwYTIwMzI4NzIyYWI5YzM4YTcyNDhiNmY1OTE4MC90cmFuc2Zvcm1lZC9va2h0dHAtNC4xMi4wLmphcgp+CIgBEnkvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvZTFlNzJkN2MxM2VlMDk1ZjUyZTY2NTIwYWM2NjQwYTUvdHJhbnNmb3JtZWQvbG9nZ2luZy1pbnRlcmNlcHRvci00LjEyLjAuamFyCnsIiQESdi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9hYTcwMjA5MjA3MzVmNTU2MDczYTUzZWQ2Yzc4YTJiMS90cmFuc2Zvcm1lZC9tYXRlcmlhbC1yaXBwbGUtcnVudGltZS5qYXIKgAEIigESey9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9kMGE5NjJkYWEzNmZiNGFiYjc4NmY2OWYzZmNhMzE5Mi90cmFuc2Zvcm1lZC9saWZlY3ljbGUtdmlld21vZGVsL3Byb2d1YXJkLnR4dAqMAQiLARKGAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8wYjk0NTc0NDZjNjRkZDc4MWJhMDhkZjJjMWMzY2JkOS90cmFuc2Zvcm1lZC9saWZlY3ljbGUtdmlld21vZGVsLXNhdmVkc3RhdGUvcHJvZ3VhcmQudHh0CosBCIwBEoUBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzMyOWQ4ZmY1NWMxMTJhYjkyNjkyNDhlMjBkMDJlZTA0L3RyYW5zZm9ybWVkL2xpZmVjeWNsZS12aWV3bW9kZWwtc2F2ZWRzdGF0ZS1ydW50aW1lLmphcgqMAQiNARKGAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8xZWJhNTE3MGIwMTU3Y2YzZTlhNDlmMDVlMDc4MzVjYS90cmFuc2Zvcm1lZC9saWZlY3ljbGUtdmlld21vZGVsLW5hdmlnYXRpb24zLXJ1bnRpbWUuamFyCncIjgESci9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9jYzM2ZmM3YzJiNWJmOWIwMGIzZmZjMDE5YzE2M2ExMy90cmFuc2Zvcm1lZC9zYXZlZHN0YXRlL3Byb2d1YXJkLnR4dAqGAQiPARKAAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy81MGYyZDFkOTczM2IyMGNlYzJiMTg5MDA5MzdhNWZiOC90cmFuc2Zvcm1lZC9hcHBjb21wYXQtcmVzb3VyY2VzLTEuNy4wLXJ1bnRpbWUuamFyCnkIkAESdC9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mNzM1YWYwNDIzNjA1YjUxYmM2M2M4ZjA2NjY0Y2M0YS90cmFuc2Zvcm1lZC9icm93c2VyLTEuOC4wLXJ1bnRpbWUuamFyCn8IkQESei9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy82Mzc2NzQ2MzhiY2FmZTZmNzViZDRlMGRmMjNiYzFiYS90cmFuc2Zvcm1lZC9leGlmaW50ZXJmYWNlLTEuMy43LXJ1bnRpbWUuamFyCogBCJIBEoIBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzFmOWRlYjY2OGJiODFjZDJmYzk5MDMwMzc5MjJlNWI5L3RyYW5zZm9ybWVkL2Fkcy1hZHNlcnZpY2VzLTEuMC4wLWJldGEwNS1ydW50aW1lLmphcgqNAQiTARKHAS9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy8yYTM4YWVkYmM2NGY2NzU5YWE2YTA5ZmFhMzM3NTEwMi90cmFuc2Zvcm1lZC9hZHMtYWRzZXJ2aWNlcy1qYXZhLTEuMC4wLWJldGEwNS1ydW50aW1lLmphcgqBAQiUARJ8L1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzM5ZWE0ODQ2ZGI2ZDcwMmUyZWRjZDk0ZmVkMmEzNzI1L3RyYW5zZm9ybWVkL3RyYWNpbmctMS4zLjAtYWxwaGEwMi1ydW50aW1lLmphcgp6CJUBEnUvVXNlcnMvYWplc2hyLy5ncmFkbGUvY2FjaGVzLzkuNC4wL3RyYW5zZm9ybXMvMTY1YTgyYWIxOGMzNjgxNzI0YTU0NjQzOTg3MzZiOGQvdHJhbnNmb3JtZWQvcnVudGltZS1yZXRhaW4tcnVudGltZS5qYXIKcwiWARJuL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzJiZDNhYzc1MmMyYTA3OWEyODJkM2I3ZmU5Y2FjMTAxL3RyYW5zZm9ybWVkL3VpLXV0aWwtcnVudGltZS5qYXIKdwiXARJyL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzM2MzMyZTA3MmJmZTc3NTdmZmZmMTdhMWVhMThkOTNkL3RyYW5zZm9ybWVkL2ZvdW5kYXRpb24vcHJvZ3VhcmQudHh0CnsImAESdi9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9mNGJjZGJjNjkwYzYxOWMxM2MyMDZjYzkwYzRkYjBmZS90cmFuc2Zvcm1lZC9hbmltYXRpb24tY29yZS9wcm9ndWFyZC50eHQKdAiZARJvL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzY4YzM3NzdlZmMzYTBmNDU1MzgyMjU1N2Q3YWU4MmYxL3RyYW5zZm9ybWVkL3J1bnRpbWUvcHJvZ3VhcmQudHh0CnwImgESdy9Vc2Vycy9hamVzaHIvLmdyYWRsZS9jYWNoZXMvOS40LjAvdHJhbnNmb3Jtcy9hOTllZDYxNzQ1MThkNTY0ZGY3NjE2NWU2MDUxNzcyNi90cmFuc2Zvcm1lZC9oaWx0LXdvcmstMS4yLjAvcHJvZ3VhcmQudHh0Co8BCJsBEokBL1VzZXJzL2FqZXNoci8uZ3JhZGxlL2NhY2hlcy85LjQuMC90cmFuc2Zvcm1zLzFlYzhkMGU1M2NlYWQ3YTdkNTI2MzkxYTBkNDYwNTQ0L3RyYW5zZm9ybWVkL3Nocmluay1ydWxlcy9saWIvTUVUQS1JTkYvcHJvZ3VhcmQvb2todHRwMy5wcm8iDRgWIglDb21wYW5pb24iEQgBEAEYFyIJQ29tcGFuaW9uIhEIAhACGBgiCUNvbXBhbmlvbiIRCAMQAxgZIglDb21wYW5pb24iEQgEEAQYGiIJQ29tcGFuaW9uIhEIBRAFGBsiCUNvbXBhbmlvbiIRCAYQCBgcIglDb21wYW5pb24iEQgHEAoYHSIJQ29tcGFuaW9uIhEICBALGB4iCUNvbXBhbmlvbiIRCAkQDBgfIglDb21wYW5pb24iEQgKEA0YICIJQ29tcGFuaW9uIhEICxAOGCEiCUNvbXBhbmlvbiIRCAwQDxgiIglDb21wYW5pb24iEQgNEBAYIyIJQ29tcGFuaW9uIhEIDhARGCQiCUNvbXBhbmlvbiIRCA8QEhglIglDb21wYW5pb24iEQgQEBQYJiIJQ29tcGFuaW9uIhEIERAVGCciCUNvbXBhbmlvbiIQCBIQBhgGIghJTlNUQU5DRSIQCBMQBxgHIghJTlNUQU5DRSIQCBQQCRgJIghJTlNUQU5DRSIQCBUQExgTIghJTlNUQU5DRSIUCBYQNRhIIgxMSUJSQVJZX05BTUUiEQgXEDcYSSIJQ29tcGFuaW9uIhEIGBA4GEoiCUNvbXBhbmlvbiIUCBkQORhIIgxMSUJSQVJZX05BTUUiFAgaEDoYSCIMTElCUkFSWV9OQU1FIhQIGxA9GEgiDExJQlJBUllfTkFNRSIaCBwQPxhIIhJFQVJMWV9MSUJSQVJZX05BTUUiFAgdED8YSCIMTElCUkFSWV9OQU1FIhgIHhBLGEwiEGFwcFN0YXRlQ2FsbGJhY2siFwgfEEsYTSIPYXBwU3RhdGVNb25pdG9yIhcIIBBLGE4iD2N1cnJlbnRBcHBTdGF0ZSIfCCEQSxhPIhdpc1JlZ2lzdGVyZWRGb3JBcHBTdGF0ZSIpCCIQQBhQIiFGRVRDSF9ORVZFUl9IQVBQRU5FRF9USU1FU1RBTVBfTVMiIwgjEEAYSCIbRklSRVBFUkZfRlJDX05BTUVTUEFDRV9OQU1FIisIJBBAGFAiI01JTl9BUFBfU1RBUlRfQ09ORklHX0ZFVENIX0RFTEFZX01TIi4IJRBAGFEiJlJBTkRPTV9BUFBfU1RBUlRfQ09ORklHX0ZFVENIX0RFTEFZX01TIjcIJhBAGFAiL1RJTUVfQUZURVJfV0hJQ0hfQV9GRVRDSF9JU19DT05TSURFUkVEX1NUQUxFX01TIhYIJxBAGFIiDmFsbFJjQ29uZmlnTWFwIiQIKBBAGFAiHGFwcFN0YXJ0Q29uZmlnRmV0Y2hEZWxheUluTXMiGAgpEEAYUCIQYXBwU3RhcnRUaW1lSW5NcyINCCoQQBhTIgVjYWNoZSIQCCsQQBhUIghleGVjdXRvciIcCCwQQBhVIhRmaXJlYmFzZVJlbW90ZUNvbmZpZyIwCC0QQBhQIihmaXJlYmFzZVJlbW90ZUNvbmZpZ0xhc3RGZXRjaFRpbWVzdGFtcE1zIiQILhBAGFYiHGZpcmViYXNlUmVtb3RlQ29uZmlnUHJvdmlkZXIiEAgvEEAYQCIIaW5zdGFuY2UiDggwEEAYVyIGbG9nZ2VyIhcIMRBCGE0iD2FwcFN0YXRlTW9uaXRvciIPCDIQQhhYIgdjbGllbnRzIhQIMxBCGEMiDGdhdWdlTWFuYWdlciIQCDQQQhhCIghpbnN0YW5jZSITCDUQQhhZIgtwZXJmU2Vzc2lvbiIWCDYQQhhaIg5zeW5jSW5pdEZ1dHVyZSI1CDcQQxhQIi1BUFBST1hfTlVNQkVSX09GX0RBVEFfUE9JTlRTX1BFUl9HQVVHRV9NRVRSSUMiKgg4EEMYUCIiSU5WQUxJRF9HQVVHRV9DT0xMRUNUSU9OX0ZSRVFVRU5DWSI0CDkQQxhQIixUSU1FX1RPX1dBSVRfQkVGT1JFX0ZMVVNISU5HX0dBVUdFU19RVUVVRV9NUyIfCDoQQxhOIhdhcHBsaWNhdGlvblByb2Nlc3NTdGF0ZSIWCDsQQxhbIg5jb25maWdSZXNvbHZlciIZCDwQQxhcIhFjcHVHYXVnZUNvbGxlY3RvciIlCD0QQxhdIh1nYXVnZU1hbmFnZXJEYXRhQ29sbGVjdGlvbkpvYiIcCD4QQxhcIhRnYXVnZU1hbmFnZXJFeGVjdXRvciIcCD8QQxheIhRnYXVnZU1ldGFkYXRhTWFuYWdlciIQCEAQQxhDIghpbnN0YW5jZSIOCEEQQxhXIgZsb2dnZXIiHAhCEEMYXCIUbWVtb3J5R2F1Z2VDb2xsZWN0b3IiEQhDEEMYSCIJc2Vzc2lvbklkIhgIRBBDGF8iEHRyYW5zcG9ydE1hbmFnZXIiFAhFEEUYSCIMTElCUkFSWV9OQU1FIhEIRhBHGGAiCUNvbXBhbmlvbiIUCEcQRxhIIgxMSUJSQVJZX05BTUUiHAhIEEcYYSIUYmFja2dyb3VuZERpc3BhdGNoZXIiGghJEEcYYSISYmxvY2tpbmdEaXNwYXRjaGVyIhMIShBHGGEiC2ZpcmViYXNlQXBwIiAISxBHGGEiGGZpcmViYXNlSW5zdGFsbGF0aW9uc0FwaSIlCEwQRxhhIh1zZXNzaW9uTGlmZWN5Y2xlU2VydmljZUJpbmRlciIYCE0QRxhhIhBzZXNzaW9uc1NldHRpbmdzIhgIThBHGGEiEHRyYW5zcG9ydEZhY3RvcnkiFQhPEH8YggEiDHNDbGFzc0xvYWRlciISCFAQgAEYSCIJTU9EVUxFX0lEIhcIURCAARhRIg5NT0RVTEVfVkVSU0lPTiIQCFIQqwIYTyIHbUFjdGl2ZSIPCFMQqwIYSCIGbUFwcElkIhsIVBCrAhhQIhJtQ3JlYXRpb25UaW1lc3RhbXAiGghVEKsCGEgiEW1FeHBpcmVkRXZlbnROYW1lIh0IVhCrAhiHASITbUV4cGlyZWRFdmVudFBhcmFtcyIOCFcQqwIYSCIFbU5hbWUiEAhYEKsCGEgiB21PcmlnaW4iFAhZEKsCGFAiC21UaW1lVG9MaXZlIhsIWhCrAhhIIhJtVGltZWRPdXRFdmVudE5hbWUiHghbEKsCGIcBIhRtVGltZWRPdXRFdmVudFBhcmFtcyIaCFwQqwIYSCIRbVRyaWdnZXJFdmVudE5hbWUiGAhdEKsCGFAiD21UcmlnZ2VyVGltZW91dCIcCF4QqwIYSCITbVRyaWdnZXJlZEV2ZW50TmFtZSIfCF8QqwIYhwEiFW1UcmlnZ2VyZWRFdmVudFBhcmFtcyIcCGAQqwIYUCITbVRyaWdnZXJlZFRpbWVzdGFtcCIPCGEQqwIYbyIGbVZhbHVlIhEIYhCsAhitAiIHQ1JFQVRPUiIaCGMQhwMYhwMiEERFRkFVTFRfSU5TVEFOQ0UiEAhkEIcDGIgDIgZQQVJTRVIiIQhlEIcDGFEiGFBSRUZFUkVOQ0VTX0ZJRUxEX05VTUJFUiIWCGYQhwMYiQMiDHByZWZlcmVuY2VzXyIaCGcQigMYigMi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X0ZJRUxEX05VTUJFUiIwCNoDEMYDGFEiJkFQUExJQ0FUSU9OX1BST0NFU1NfU1RBVEVfRklFTERfTlVNQkVSIiYI2wMQxgMYUSIcQVBQX0lOU1RBTkNFX0lEX0ZJRUxEX05VTUJFUiIoCNwDEMYDGFEiHkNVU1RPTV9BVFRSSUJVVEVTX0ZJRUxEX05VTUJFUiIbCN0DEMYDGMYDIhBERUZBVUxUX0lOU1RBTkNFIiQI3gMQxgMYUSIaR09PR0xFX0FQUF9JRF9GSUVMRF9OVU1CRVIiEQjfAxDGAxjEAyIGUEFSU0VSIhoI4AMQxgMYwwMiD2FuZHJvaWRBcHBJbmZvXyIYCOEDEMYDGEgiDmFwcEluc3RhbmNlSWRfIiII4gMQxgMYUSIYYXBwbGljYXRpb25Qcm9jZXNzU3RhdGVfIhQI4wMQxgMYUSIKYml0RmllbGQwXyIcCOQDEMYDGMcDIhFjdXN0b21BdHRyaWJ1dGVzXyIWCOUDEMYDGEgiDGdvb2dsZUFwcElkXyIlCOYDEMgDGFEiG0NMSUVOVF9USU1FX1VTX0ZJRUxEX05VTUJFUiIbCOcDEMgDGMgDIhBERUZBVUxUX0lOU1RBTkNFIhEI6AMQyAMYxAMiBlBBUlNFUiIlCOkDEMgDGFEiG1NZU1RFTV9USU1FX1VTX0ZJRUxEX05VTUJFUiIjCOoDEMgDGFEiGVVTRVJfVElNRV9VU19GSUVMRF9OVU1CRVIiFAjrAxDIAxhRIgpiaXRGaWVsZDBfIhcI7AMQyAMYUCINY2xpZW50VGltZVVzXyIXCO0DEMgDGFAiDXN5c3RlbVRpbWVVc18iFQjuAxDIAxhQIgt1c2VyVGltZVVzXyIoCO8DEHcYUSIfQ1BVX0NMT0NLX1JBVEVfS0haX0ZJRUxEX05VTUJFUiIpCPADEHcYUSIgQ1BVX1BST0NFU1NPUl9DT1VOVF9GSUVMRF9OVU1CRVIiGQjxAxB3GHciEERFRkFVTFRfSU5TVEFOQ0UiKAjyAxB3GFEiH0RFVklDRV9SQU1fU0laRV9LQl9GSUVMRF9OVU1CRVIiMQjzAxB3GFEiKE1BWF9BUFBfSkFWQV9IRUFQX01FTU9SWV9LQl9GSUVMRF9OVU1CRVIiPAj0AxB3GFEiM01BWF9FTkNPVVJBR0VEX0FQUF9KQVZBX0hFQVBfTUVNT1JZX0tCX0ZJRUxEX05VTUJFUiIQCPUDEHcYxAMiBlBBUlNFUiIiCPYDEHcYUSIZUFJPQ0VTU19OQU1FX0ZJRUxEX05VTUJFUiITCPcDEHcYUSIKYml0RmllbGQwXyIZCPgDEHcYUSIQY3B1Q2xvY2tSYXRlS2h6XyIbCPkDEHcYUSISY3B1UHJvY2Vzc29yQ291bnRfIhkI+gMQdxhRIhBkZXZpY2VSYW1TaXplS2JfIiAI+wMQdxhRIhdtYXhBcHBKYXZhSGVhcE1lbW9yeUtiXyIqCPwDEHcYUSIhbWF4RW5jb3VyYWdlZEFwcEphdmFIZWFwTWVtb3J5S2JfIhUI/QMQdxhIIgxwcm9jZXNzTmFtZV8iLgj+AxDJAxhRIiRBTkRST0lEX01FTU9SWV9SRUFESU5HU19GSUVMRF9OVU1CRVIiKgj/AxDJAxhRIiBDUFVfTUVUUklDX1JFQURJTkdTX0ZJRUxEX05VTUJFUiIbCIAEEMkDGMkDIhBERUZBVUxUX0lOU1RBTkNFIiUIgQQQyQMYUSIbR0FVR0VfTUVUQURBVEFfRklFTERfTlVNQkVSIhEIggQQyQMYxAMiBlBBUlNFUiIhCIMEEMkDGFEiF1NFU1NJT05fSURfRklFTERfTlVNQkVSIiEIhAQQyQMYygMiFmFuZHJvaWRNZW1vcnlSZWFkaW5nc18iFAiFBBDJAxhRIgpiaXRGaWVsZDBfIh0IhgQQyQMYygMiEmNwdU1ldHJpY1JlYWRpbmdzXyIYCIcEEMkDGHciDmdhdWdlTWV0YWRhdGFfIhQIiAQQyQMYSCIKc2Vzc2lvbklkXyIrCIkEEMsDGFEiIUNMSUVOVF9TVEFSVF9USU1FX1VTX0ZJRUxEX05VTUJFUiIoCIoEEMsDGFEiHkNVU1RPTV9BVFRSSUJVVEVTX0ZJRUxEX05VTUJFUiIbCIsEEMsDGMsDIhBERUZBVUxUX0lOU1RBTkNFIiIIjAQQywMYUSIYSFRUUF9NRVRIT0RfRklFTERfTlVNQkVSIikIjQQQywMYUSIfSFRUUF9SRVNQT05TRV9DT0RFX0ZJRUxEX05VTUJFUiIyCI4EEMsDGFEiKE5FVFdPUktfQ0xJRU5UX0VSUk9SX1JFQVNPTl9GSUVMRF9OVU1CRVIiEQiPBBDLAxjEAyIGUEFSU0VSIiQIkAQQywMYUSIaUEVSRl9TRVNTSU9OU19GSUVMRF9OVU1CRVIiLAiRBBDLAxhRIiJSRVFVRVNUX1BBWUxPQURfQllURVNfRklFTERfTlVNQkVSIiwIkgQQywMYUSIiUkVTUE9OU0VfQ09OVEVOVF9UWVBFX0ZJRUxEX05VTUJFUiItCJMEEMsDGFEiI1JFU1BPTlNFX1BBWUxPQURfQllURVNfRklFTERfTlVNQkVSIjMIlAQQywMYUSIpVElNRV9UT19SRVFVRVNUX0NPTVBMRVRFRF9VU19GSUVMRF9OVU1CRVIiNAiVBBDLAxhRIipUSU1FX1RPX1JFU1BPTlNFX0NPTVBMRVRFRF9VU19GSUVMRF9OVU1CRVIiNAiWBBDLAxhRIipUSU1FX1RPX1JFU1BPTlNFX0lOSVRJQVRFRF9VU19GSUVMRF9OVU1CRVIiGgiXBBDLAxhRIhBVUkxfRklFTERfTlVNQkVSIhQImAQQywMYUSIKYml0RmllbGQwXyIcCJkEEMsDGFAiEmNsaWVudFN0YXJ0VGltZVVzXyIcCJoEEMsDGMcDIhFjdXN0b21BdHRyaWJ1dGVzXyIVCJsEEMsDGFEiC2h0dHBNZXRob2RfIhsInAQQywMYUSIRaHR0cFJlc3BvbnNlQ29kZV8iIwidBBDLAxhRIhluZXR3b3JrQ2xpZW50RXJyb3JSZWFzb25fIhgIngQQywMYygMiDXBlcmZTZXNzaW9uc18iHgifBBDLAxhQIhRyZXF1ZXN0UGF5bG9hZEJ5dGVzXyIeCKAEEMsDGEgiFHJlc3BvbnNlQ29udGVudFR5cGVfIh8IoQQQywMYUCIVcmVzcG9uc2VQYXlsb2FkQnl0ZXNfIiMIogQQywMYUCIZdGltZVRvUmVxdWVzdENvbXBsZXRlZFVzXyIkCKMEEMsDGFAiGnRpbWVUb1Jlc3BvbnNlQ29tcGxldGVkVXNfIiQIpAQQywMYUCIadGltZVRvUmVzcG9uc2VJbml0aWF0ZWRVc18iDgilBBDLAxhIIgR1cmxfIicIpgQQzAMYUSIdQVBQTElDQVRJT05fSU5GT19GSUVMRF9OVU1CRVIiGwinBBDMAxjMAyIQREVGQVVMVF9JTlNUQU5DRSIjCKgEEMwDGFEiGUdBVUdFX01FVFJJQ19GSUVMRF9OVU1CRVIiLQipBBDMAxhRIiNORVRXT1JLX1JFUVVFU1RfTUVUUklDX0ZJRUxEX05VTUJFUiIRCKoEEMwDGMQDIgZQQVJTRVIiIwirBBDMAxhRIhlUUkFDRV9NRVRSSUNfRklFTERfTlVNQkVSIiUIrAQQzAMYUSIbVFJBTlNQT1JUX0lORk9fRklFTERfTlVNQkVSIhsIrQQQzAMYxgMiEGFwcGxpY2F0aW9uSW5mb18iFAiuBBDMAxhRIgpiaXRGaWVsZDBfIhcIrwQQzAMYyQMiDGdhdWdlTWV0cmljXyIgCLAEEMwDGMsDIhVuZXR3b3JrUmVxdWVzdE1ldHJpY18iFwixBBDMAxjNAyIMdHJhY2VNZXRyaWNfIhkIsgQQzAMYzgMiDnRyYW5zcG9ydEluZm9fIhsIswQQzwMYzwMiEERFRkFVTFRfSU5TVEFOQ0UiEQi0BBDPAxjEAyIGUEFSU0VSIiEItQQQzwMYUSIXU0VTU0lPTl9JRF9GSUVMRF9OVU1CRVIiKAi2BBDPAxhRIh5TRVNTSU9OX1ZFUkJPU0lUWV9GSUVMRF9OVU1CRVIiFAi3BBDPAxhRIgpiaXRGaWVsZDBfIhQIuAQQzwMYSCIKc2Vzc2lvbklkXyIcCLkEEM8DGNADIhFzZXNzaW9uVmVyYm9zaXR5XyImCLoEEM8DGNEDIhtzZXNzaW9uVmVyYm9zaXR5X2NvbnZlcnRlcl8iKwi7BBDNAxhRIiFDTElFTlRfU1RBUlRfVElNRV9VU19GSUVMRF9OVU1CRVIiHwi8BBDNAxhRIhVDT1VOVEVSU19GSUVMRF9OVU1CRVIiKAi9BBDNAxhRIh5DVVNUT01fQVRUUklCVVRFU19GSUVMRF9OVU1CRVIiGwi+BBDNAxjNAyIQREVGQVVMVF9JTlNUQU5DRSIiCL8EEM0DGFEiGERVUkFUSU9OX1VTX0ZJRUxEX05VTUJFUiIeCMAEEM0DGFEiFElTX0FVVE9fRklFTERfTlVNQkVSIhsIwQQQzQMYUSIRTkFNRV9GSUVMRF9OVU1CRVIiEQjCBBDNAxjEAyIGUEFSU0VSIiQIwwQQzQMYUSIaUEVSRl9TRVNTSU9OU19GSUVMRF9OVU1CRVIiIAjEBBDNAxhRIhZTVUJUUkFDRVNfRklFTERfTlVNQkVSIhQIxQQQzQMYUSIKYml0RmllbGQwXyIcCMYEEM0DGFAiEmNsaWVudFN0YXJ0VGltZVVzXyIUCMcEEM0DGMcDIgljb3VudGVyc18iHAjIBBDNAxjHAyIRY3VzdG9tQXR0cmlidXRlc18iFQjJBBDNAxhQIgtkdXJhdGlvblVzXyIRCMoEEM0DGE8iB2lzQXV0b18iDwjLBBDNAxhIIgVuYW1lXyIYCMwEEM0DGMoDIg1wZXJmU2Vzc2lvbnNfIhUIzQQQzQMYygMiCnN1YnRyYWNlc18iGwjOBBDOAxjOAyIQREVGQVVMVF9JTlNUQU5DRSIrCM8EEM4DGFEiIURJU1BBVENIX0RFU1RJTkFUSU9OX0ZJRUxEX05VTUJFUiIRCNAEEM4DGMQDIgZQQVJTRVIiFAjRBBDOAxhRIgpiaXRGaWVsZDBfIh4I0gQQzgMYUSIUZGlzcGF0Y2hEZXN0aW5hdGlvbl8iGgjTBBDSAxhRIhBtZW1vaXplZEhhc2hDb2RlIhoI1AQQ0wMY1AMiD2RlZmF1bHRJbnN0YW5jZSITCNUEENMDGNQDIghpbnN0YW5jZSInCNYEENQDGFEiHU1FTU9JWkVEX1NFUklBTElaRURfU0laRV9NQVNLIhsI1wQQ1AMYUSIRTVVUQUJMRV9GTEFHX01BU0siIQjYBBDUAxhRIhdVTklOSVRJQUxJWkVEX0hBU0hfQ09ERSInCNkEENQDGFEiHVVOSU5JVElBTElaRURfU0VSSUFMSVpFRF9TSVpFIhwI2gQQ1AMYcyISZGVmYXVsdEluc3RhbmNlTWFwIiAI2wQQ1AMYUSIWbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSIYCNwEENQDGNUDIg11bmtub3duRmllbGRzIi4I3QQQ1gMYUSIkQVVUSE9SQ0hBTkdFTElTVFZFUlNJT05fRklFTERfTlVNQkVSIjMI3gQQ1gMYUSIpQk9PS01BUktFRF9ORVdTX1JFU09VUkNFX0lEU19GSUVMRF9OVU1CRVIiKAjfBBDWAxhRIh5EQVJLX1RIRU1FX0NPTkZJR19GSUVMRF9OVU1CRVIiGwjgBBDWAxjWAyIQREVGQVVMVF9JTlNUQU5DRSI+COEEENYDGFEiNERFUFJFQ0FURURfQk9PS01BUktFRF9ORVdTX1JFU09VUkNFX0lEU19GSUVMRF9OVU1CRVIiNQjiBBDWAxhRIitERVBSRUNBVEVEX0ZPTExPV0VEX0FVVEhPUl9JRFNfRklFTERfTlVNQkVSIjQI4wQQ1gMYUSIqREVQUkVDQVRFRF9GT0xMT1dFRF9UT1BJQ19JRFNfRklFTERfTlVNQkVSIjkI5AQQ1gMYUSIvREVQUkVDQVRFRF9JTlRfRk9MTE9XRURfQVVUSE9SX0lEU19GSUVMRF9OVU1CRVIiOAjlBBDWAxhRIi5ERVBSRUNBVEVEX0lOVF9GT0xMT1dFRF9UT1BJQ19JRFNfRklFTERfTlVNQkVSIioI5gQQ1gMYUSIgRk9MTE9XRURfQVVUSE9SX0lEU19GSUVMRF9OVU1CRVIiKQjnBBDWAxhRIh9GT0xMT1dFRF9UT1BJQ19JRFNfRklFTERfTlVNQkVSIjoI6AQQ1gMYUSIwSEFTX0RPTkVfSU5UX1RPX1NUUklOR19JRF9NSUdSQVRJT05fRklFTERfTlVNQkVSIjUI6QQQ1gMYUSIrSEFTX0RPTkVfTElTVF9UT19NQVBfTUlHUkFUSU9OX0ZJRUxEX05VTUJFUiI0COoEENYDGFEiKk5FV1NSRVNPVVJDRUNIQU5HRUxJU1RWRVJTSU9OX0ZJRUxEX05VTUJFUiIRCOsEENYDGMQDIgZQQVJTRVIiLQjsBBDWAxhRIiNTSE9VTERfSElERV9PTkJPQVJESU5HX0ZJRUxEX05VTUJFUiIiCO0EENYDGFEiGFRIRU1FX0JSQU5EX0ZJRUxEX05VTUJFUiItCO4EENYDGFEiI1RPUElDQ0hBTkdFTElTVFZFUlNJT05fRklFTERfTlVNQkVSIigI7wQQ1gMYUSIeVVNFX0RZTkFNSUNfQ09MT1JfRklFTERfTlVNQkVSIi8I8AQQ1gMYUSIlVklFV0VEX05FV1NfUkVTT1VSQ0VfSURTX0ZJRUxEX05VTUJFUiIiCPEEENYDGFEiGGF1dGhvckNoYW5nZUxpc3RWZXJzaW9uXyIlCPIEENYDGMcDIhpib29rbWFya2VkTmV3c1Jlc291cmNlSWRzXyIaCPMEENYDGFEiEGRhcmtUaGVtZUNvbmZpZ18iLwj0BBDWAxjKAyIkZGVwcmVjYXRlZEJvb2ttYXJrZWROZXdzUmVzb3VyY2VJZHNfIicI9QQQ1gMYygMiHGRlcHJlY2F0ZWRGb2xsb3dlZEF1dGhvcklkc18iJgj2BBDWAxjKAyIbZGVwcmVjYXRlZEZvbGxvd2VkVG9waWNJZHNfIj4I9wQQ1gMYUSI0ZGVwcmVjYXRlZEludEZvbGxvd2VkQXV0aG9ySWRzTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSIqCPgEENYDGNADIh9kZXByZWNhdGVkSW50Rm9sbG93ZWRBdXRob3JJZHNfIj0I+QQQ1gMYUSIzZGVwcmVjYXRlZEludEZvbGxvd2VkVG9waWNJZHNNZW1vaXplZFNlcmlhbGl6ZWRTaXplIikI+gQQ1gMY0AMiHmRlcHJlY2F0ZWRJbnRGb2xsb3dlZFRvcGljSWRzXyIdCPsEENYDGMcDIhJmb2xsb3dlZEF1dGhvcklkc18iHAj8BBDWAxjHAyIRZm9sbG93ZWRUb3BpY0lkc18iKAj9BBDWAxhPIh5oYXNEb25lSW50VG9TdHJpbmdJZE1pZ3JhdGlvbl8iJAj+BBDWAxhPIhpoYXNEb25lTGlzdFRvTWFwTWlncmF0aW9uXyIoCP8EENYDGFEiHm5ld3NSZXNvdXJjZUNoYW5nZUxpc3RWZXJzaW9uXyIfCIAFENYDGE8iFXNob3VsZEhpZGVPbmJvYXJkaW5nXyIVCIEFENYDGFEiC3RoZW1lQnJhbmRfIiEIggUQ1gMYUSIXdG9waWNDaGFuZ2VMaXN0VmVyc2lvbl8iGgiDBRDWAxhPIhB1c2VEeW5hbWljQ29sb3JfIiEIhAUQ1gMYxwMiFnZpZXdlZE5ld3NSZXNvdXJjZUlkc18iEgiFBRDXAxitAiIHQ1JFQVRPUiISCIYFENgDGK0CIgdDUkVBVE9SIhIIhwUQ2QMYrQIiB0NSRUFUT1IiEgiIBRDaAxitAiIHQ1JFQVRPUiISCIkFENsDGK0CIgdDUkVBVE9SIhIIigUQ3AMYrQIiB0NSRUFUT1IiEgiLBRDdAxitAiIHQ1JFQVRPUiISCIwFEN4DGK0CIgdDUkVBVE9SIhIIjQUQ3wMYrQIiB0NSRUFUT1IiEgiOBRDgAxitAiIHQ1JFQVRPUiISCI8FEOEDGK0CIgdDUkVBVE9SIhIIkAUQ4gMYrQIiB0NSRUFUT1IiEgiRBRDjAxitAiIHQ1JFQVRPUiISCJIFEOQDGK0CIgdDUkVBVE9SIhIIkwUQ5QMYrQIiB0NSRUFUT1IiEgiUBRDmAxitAiIHQ1JFQVRPUiISCJUFEOcDGK0CIgdDUkVBVE9SIhIIlgUQuAEYrQIiB0NSRUFUT1IiEgiXBRDoAxitAiIHQ1JFQVRPUiISCJgFEOkDGK0CIgdDUkVBVE9SIhIImQUQ6gMYrQIiB0NSRUFUT1IiEgiaBRDrAxitAiIHQ1JFQVRPUiISCJsFEOwDGK0CIgdDUkVBVE9SIhIInAUQ7QMYrQIiB0NSRUFUT1IiEgidBRDuAxitAiIHQ1JFQVRPUiISCJ4FEO8DGK0CIgdDUkVBVE9SIhIInwUQ8AMYrQIiB0NSRUFUT1IiEgigBRDxAxitAiIHQ1JFQVRPUiISCKEFEPIDGK0CIgdDUkVBVE9SIhIIogUQ8wMYrQIiB0NSRUFUT1IiEgijBRD0AxitAiIHQ1JFQVRPUiISCKQFEPUDGK0CIgdDUkVBVE9SIhIIpQUQ9gMYrQIiB0NSRUFUT1IiEgimBRD3AxitAiIHQ1JFQVRPUiISCKcFEPgDGK0CIgdDUkVBVE9SIhIIqAUQ+QMYrQIiB0NSRUFUT1IiEgipBRD6AxitAiIHQ1JFQVRPUiISCKoFEIoBGK0CIgdDUkVBVE9SIhIIqwUQ+wMYrQIiB0NSRUFUT1IiEgisBRD8AxitAiIHQ1JFQVRPUiISCK0FEP0DGK0CIgdDUkVBVE9SIhIIrgUQ/gMYrQIiB0NSRUFUT1IiEgivBRD/AxitAiIHQ1JFQVRPUiISCLAFEIAEGK0CIgdDUkVBVE9SIhIIsQUQgQQYrQIiB0NSRUFUT1IiEgiyBRCCBBitAiIHQ1JFQVRPUiISCLMFEIMEGK0CIgdDUkVBVE9SIhIItAUQhAQYrQIiB0NSRUFUT1IiEgi1BRCFBBitAiIHQ1JFQVRPUiISCLYFEIYEGK0CIgdDUkVBVE9SIhIItwUQhwQYrQIiB0NSRUFUT1IiEgi4BRCIBBitAiIHQ1JFQVRPUiIRCLkFEFkYrQIiB0NSRUFUT1IiEQi6BRB2GK0CIgdDUkVBVE9SIhQIuwUQiwQYjAQiCUNvbXBhbmlvbiIWCLwFEI0EGI4EIgttVmlld0JvdW5kcyIQCL0FEJcEGG8iBnJlc3VsdCIcCL4FEJgEGG8iEl9kaXNwb3NlciR2b2xhdGlsZSIkCL8FEJkEGFEiGm5vdENvbXBsZXRlZENvdW50JHZvbGF0aWxlIiQIwAUQmgQYUSIaX2RlY2lzaW9uQW5kSW5kZXgkdm9sYXRpbGUiIAjBBRCaBBhvIhZfcGFyZW50SGFuZGxlJHZvbGF0aWxlIhkIwgUQmgQYbyIPX3N0YXRlJHZvbGF0aWxlIhsIwwUQmwQYUSIRX3Jlc3VtZWQkdm9sYXRpbGUiGwjEBRCcBBhRIhFfaGFuZGxlZCR2b2xhdGlsZSISCMUFEJ0EGJ4EIgdfdGhyZWFkIhUIxgUQnQQYUSILZGVidWdTdGF0dXMiHAjHBRCfBBhRIhJfZGVjaXNpb24kdm9sYXRpbGUiDwjIBRCgBBhvIgVfaGVhcCIbCMkFEKEEGG8iEV9kZWxheWVkJHZvbGF0aWxlIh8IygUQoQQYUSIVX2lzQ29tcGxldGVkJHZvbGF0aWxlIhkIywUQoQQYbyIPX3F1ZXVlJHZvbGF0aWxlIhsIzAUQogQYUSIRX2ludm9rZWQkdm9sYXRpbGUiJAjNBRCjBBhvIhpfZXhjZXB0aW9uc0hvbGRlciR2b2xhdGlsZSIgCM4FEKMEGFEiFl9pc0NvbXBsZXRpbmckdm9sYXRpbGUiHQjPBRCjBBhvIhNfcm9vdENhdXNlJHZvbGF0aWxlIiAI0AUQpAQYbyIWX3BhcmVudEhhbmRsZSR2b2xhdGlsZSIZCNEFEKQEGG8iD19zdGF0ZSR2b2xhdGlsZSIZCNIFEKUEGFEiD19zdGF0ZSR2b2xhdGlsZSIaCNMFEKYEGE8iEHRocmVhZExvY2FsSXNTZXQiFQjUBRCnBBhvIgtfcHJlSGFuZGxlciIYCNUFEKgEGKkEIg1jaG9yZW9ncmFwaGVyIh4I1gUQqgQYbyIUX2Nsb3NlQ2F1c2Ukdm9sYXRpbGUiHAjXBRCqBBhQIhJidWZmZXJFbmQkdm9sYXRpbGUiIwjYBRCqBBhvIhlidWZmZXJFbmRTZWdtZW50JHZvbGF0aWxlIh8I2QUQqgQYbyIVY2xvc2VIYW5kbGVyJHZvbGF0aWxlIjUI2gUQqgQYUCIrY29tcGxldGVkRXhwYW5kQnVmZmVyc0FuZFBhdXNlRmxhZyR2b2xhdGlsZSIhCNsFEKoEGG8iF3JlY2VpdmVTZWdtZW50JHZvbGF0aWxlIhwI3AUQqgQYUCIScmVjZWl2ZXJzJHZvbGF0aWxlIh4I3QUQqgQYbyIUc2VuZFNlZ21lbnQkdm9sYXRpbGUiKAjeBRCqBBhQIh5zZW5kZXJzQW5kQ2xvc2VTdGF0dXMkdm9sYXRpbGUiGQjfBRCrBBhvIg9fc3RhdGUkdm9sYXRpbGUiGAjgBRCsBBhvIg5fbmV4dCR2b2xhdGlsZSIYCOEFEKwEGG8iDl9wcmV2JHZvbGF0aWxlIjMI4gUQrQQYbyIpX3JldXNhYmxlQ2FuY2VsbGFibGVDb250aW51YXRpb24kdm9sYXRpbGUiIQjjBRCuBBhRIhdydW5uaW5nV29ya2VycyR2b2xhdGlsZSIYCOQFEK8EGG8iDl9uZXh0JHZvbGF0aWxlIhgI5QUQrwQYbyIOX3ByZXYkdm9sYXRpbGUiHgjmBRCvBBhvIhRfcmVtb3ZlZFJlZiR2b2xhdGlsZSIXCOcFELAEGG8iDV9jdXIkdm9sYXRpbGUiGAjoBRCxBBhvIg5fbmV4dCR2b2xhdGlsZSIZCOkFELEEGFAiD19zdGF0ZSR2b2xhdGlsZSIQCOoFELIEGLMEIgVhcnJheSIlCOsFELQEGFEiG2NsZWFuZWRBbmRQb2ludGVycyR2b2xhdGlsZSIYCOwFELUEGFEiDl9zaXplJHZvbGF0aWxlIhYI7QUQtgQYUSIMaW5kZXhJbkFycmF5IhoI7gUQtgQYbyIQbmV4dFBhcmtlZFdvcmtlciIcCO8FELYEGFEiEndvcmtlckN0bCR2b2xhdGlsZSIgCPAFELcEGFEiFl9pc1Rlcm1pbmF0ZWQkdm9sYXRpbGUiHwjxBRC3BBhQIhVjb250cm9sU3RhdGUkdm9sYXRpbGUiJQjyBRC3BBhQIhtwYXJrZWRXb3JrZXJzU3RhY2skdm9sYXRpbGUiKAjzBRC4BBhRIh5ibG9ja2luZ1Rhc2tzSW5CdWZmZXIkdm9sYXRpbGUiIAj0BRC4BBhRIhZjb25zdW1lckluZGV4JHZvbGF0aWxlIiQI9QUQuAQYbyIabGFzdFNjaGVkdWxlZFRhc2skdm9sYXRpbGUiIAj2BRC4BBhRIhZwcm9kdWNlckluZGV4JHZvbGF0aWxlIhgI9wUQuQQYbyIOb3duZXIkdm9sYXRpbGUiJAj4BRC6BBhRIhpfYXZhaWxhYmxlUGVybWl0cyR2b2xhdGlsZSIZCPkFELoEGFAiD2RlcUlkeCR2b2xhdGlsZSIZCPoF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b3JtYW5jZSoTCEAQSxgOIgtnZXRBcHBTdGF0ZSobCEEQSxgPIhNnZXRBcHBTdGF0ZUNhbGxiYWNrKhoIQhBLGBAiEmluY3JlbWVudFRzbnNDb3VudCobCEMQSxgEIhNyZWdpc3RlckZvckFwcFN0YXRlKh0IRBBLGAQiFXVucmVnaXN0ZXJGb3JBcHBTdGF0ZSoOCEUQQBgEIgY8aW5pdD4qDghGEEAYESIGPGluaXQ+KhIIRxBAGBIiCmdldEJvb2xlYW4qIghIEEAYEyIaZ2V0Q3VycmVudFN5c3RlbVRpbWVNaWxsaXMqEQhJEEAYEiIJZ2V0RG91YmxlKh8IShBAGBMiF2dldEluaXRpYWxTdGFydHVwTWlsbGlzKhMISxBAGBQiC2dldEluc3RhbmNlKg8ITBBAGBIiB2dldExvbmcqHAhNEEAYFSIUZ2V0UmVtb3RlQ29uZmlnVmFsdWUqJQhOEEAYFiIdZ2V0UmVtb3RlQ29uZmlnVmFsdWVPckRlZmF1bHQqEQhPEEAYEiIJZ2V0U3RyaW5nKhYIUBBAGBciDmdldFZlcnNpb25Db2RlKioIURBAGBgiImhhc0FwcFN0YXJ0Q29uZmlnRmV0Y2hEZWxheUVsYXBzZWQqHwhSEEAYGCIXaGFzTGFzdEZldGNoQmVjb21lU3RhbGUqJwhTEEAYGSIfaXNGaXJlYmFzZVJlbW90ZUNvbmZpZ0F2YWlsYWJsZSoZCFQQQBgZIhFpc0xhc3RGZXRjaEZhaWxlZCpNCFUQQBgaIkVsYW1iZGEkdHJpZ2dlckZpcmViYXNlUmVtb3RlQ29uZmlnRmV0Y2hBbmRBY3RpdmF0ZU9uU3VjY2Vzc2Z1bEZldGNoJDAqTQhWEEAYGyJFbGFtYmRhJHRyaWdnZXJGaXJlYmFzZVJlbW90ZUNvbmZpZ0ZldGNoQW5kQWN0aXZhdGVPblN1Y2Nlc3NmdWxGZXRjaCQxKicIVxBAGBwiH3NldEZpcmViYXNlUmVtb3RlQ29uZmlnUHJvdmlkZXIqMAhYEEAYGSIoc2hvdWxkRmV0Y2hBbmRBY3RpdmF0ZVJlbW90ZUNvbmZpZ1ZhbHVlcyoYCFkQQBgdIhBzeW5jQ29uZmlnVmFsdWVzKkQIWhBAGAQiPHRyaWdnZXJGaXJlYmFzZVJlbW90ZUNvbmZpZ0ZldGNoQW5kQWN0aXZhdGVPblN1Y2Nlc3NmdWxGZXRjaCorCFsQQBgEIiN0cmlnZ2VyUmVtb3RlQ29uZmlnRmV0Y2hJZk5lY2Vzc2FyeSoOCFwQQRgEIgY8aW5pdD4qFQhdEEEYBiINZ2V0Q29tcG9uZW50cyoOCF4QQhgEIgY8aW5pdD4qDghfEEIYHiIGPGluaXQ+KhMIYBBCGB8iC2dldEluc3RhbmNlKhkIYRBCGCAiEWdldFN5bmNJbml0RnV0dXJlKiEIYhBCGAQiGWluaXRpYWxpemVHYXVnZUNvbGxlY3Rpb24qJghjEEIYISIebGFtYmRhJHNldEFwcGxpY2F0aW9uQ29udGV4dCQwKisIZBBCGCIiI2xvZ0dhdWdlTWV0YWRhdGFJZkNvbGxlY3Rpb25FbmFibGVkKhgIZRBCGCIiEG9uVXBkYXRlQXBwU3RhdGUqEwhmEEIYIyILcGVyZlNlc3Npb24qIQhnEEIYJCIZcmVnaXN0ZXJGb3JTZXNzaW9uVXBkYXRlcyodCGgQQhglIhVzZXRBcHBsaWNhdGlvbkNvbnRleHQqFghpEEIYJiIOc2V0UGVyZlNlc3Npb24qIwhqEEIYIiIbc3RhcnRPclN0b3BDb2xsZWN0aW5nR2F1Z2VzKjIIaxBCGAQiKnN0b3BHYXVnZUNvbGxlY3Rpb25JZlNlc3Npb25SdW5uaW5nVG9vTG9uZyojCGwQQhgkIht1bnJlZ2lzdGVyRm9yU2Vzc2lvblVwZGF0ZXMqGQhtEEIYJiIRdXBkYXRlUGVyZlNlc3Npb24qDghuEEMYBCIGPGluaXQ+Kg4IbxBDGCciBjxpbml0PioeCHAQQxgoIhZjb2xsZWN0R2F1Z2VNZXRyaWNPbmNlKh4IcRBDGCkiFmNvbGxlY3RHYXVnZU1ldHJpY09uY2UqKAhyEEMYKiIgZ2V0Q3B1R2F1Z2VDb2xsZWN0aW9uRnJlcXVlbmN5TXMqGAhzEEMYKyIQZ2V0R2F1Z2VNZXRhZGF0YSoTCHQQQxgsIgtnZXRJbnN0YW5jZSorCHUQQxgqIiNnZXRNZW1vcnlHYXVnZUNvbGxlY3Rpb25GcmVxdWVuY3lNcyomCHYQQxglIh5pbml0aWFsaXplR2F1Z2VNZXRhZGF0YU1hbmFnZXIqFAh3EEMYLSIMbGFtYmRhJG5ldyQwKhQIeBBDGC4iDGxhbWJkYSRuZXckMSomCHkQQxgvIh5sYW1iZGEkc3RhcnRDb2xsZWN0aW5nR2F1Z2VzJDIqJQh6EEMYLyIdbGFtYmRhJHN0b3BDb2xsZWN0aW5nR2F1Z2VzJDMqGAh7EEMYMCIQbG9nR2F1Z2VNZXRhZGF0YSohCHwQQxgxIhlzdGFydENvbGxlY3RpbmdDcHVNZXRyaWNzKh0IfRBDGDIiFXN0YXJ0Q29sbGVjdGluZ0dhdWdlcyodCH4QQxgzIhVzdGFydENvbGxlY3RpbmdHYXVnZXMqJAh/EEMYMSIcc3RhcnRDb2xsZWN0aW5nTWVtb3J5TWV0cmljcyodCIABEEMYBCIUc3RvcENvbGxlY3RpbmdHYXVnZXMqEgiBARBDGC8iCXN5bmNGbHVzaCoPCIIBEEQYBCIGPGluaXQ+KhYIgwEQRBgGIg1nZXRDb21wb25lbnRzKg8IhAEQRRgEIgY8aW5pdD4qFgiFARBFGAYiDWdldENvbXBvbmVudHMqHwiGARBFGDQiFmxhbWJkYSRnZXRDb21wb25lbnRzJDAqDwiHARBGGAQiBjxpbml0PioWCIgBEEYYBiINZ2V0Q29tcG9uZW50cyoPCIkBEEcYBCIGPGluaXQ+KhYIigEQRxgGIg1nZXRDb21wb25lbnRzKh8IiwEQRxg1IhZnZXRDb21wb25lbnRzJGxhbWJkYSQwKh8IjAEQRxg2IhZnZXRDb21wb25lbnRzJGxhbWJkYSQxKh8IjQEQRxg3IhZnZXRDb21wb25lbnRzJGxhbWJkYSQyKh8IjgEQRxg4IhZnZXRDb21wb25lbnRzJGxhbWJkYSQzKh8IjwEQRxg5IhZnZXRDb21wb25lbnRzJGxhbWJkYSQ0Kh8IkAEQRxg6IhZnZXRDb21wb25lbnRzJGxhbWJkYSQ1Kg8IkQEQfxgEIgY8aW5pdD4qEAiSARCAARgEIgY8aW5pdD4qEgiTARCDARg7Ighhc0JpbmRlcioUCJQBEIMBGDwiCm9uVHJhbnNhY3QqFQiVARCFARg9Igthc0ludGVyZmFjZSoQCJYBEIEBGAQiBjxpbml0PiodCJcBEIEBGD4iE2JlZ2luQWRVbml0RXhwb3N1cmUqJgiYARCBARg/IhxjbGVhckNvbmRpdGlvbmFsVXNlclByb3BlcnR5KiEImQEQgQEYQCIXY2xlYXJNZWFzdXJlbWVudEVuYWJsZWQqGwiaARCBARg+IhFlbmRBZFVuaXRFeHBvc3VyZSoZCJsBEIEBGEEiD2dlbmVyYXRlRXZlbnRJZCoaCJwBEIEBGEEiEGdldEFwcEluc3RhbmNlSWQqIAidARCBARhBIhZnZXRDYWNoZWRBcHBJbnN0YW5jZUlkKiYIngEQgQEYQiIcZ2V0Q29uZGl0aW9uYWxVc2VyUHJvcGVydGllcyofCJ8BEIEBGEEiFWdldEN1cnJlbnRTY3JlZW5DbGFzcyoeCKABEIEBGEEiFGdldEN1cnJlbnRTY3JlZW5OYW1lKhUIoQEQgQEYQSILZ2V0R21wQXBwSWQqHgiiARCBARhDIhRnZXRNYXhVc2VyUHJvcGVydGllcyoWCKMBEIEBGEEiDGdldFNlc3Npb25JZCoVCKQBEIEBGEQiC2dldFRlc3RGbGFnKhsIpQEQgQEYRSIRZ2V0VXNlclByb3BlcnRpZXMqFgimARCBARgdIgxpbml0Rm9yVGVzdHMqFAinARCBARhGIgppbml0aWFsaXplKiEIqAEQgQEYQSIXaXNEYXRhQ29sbGVjdGlvbkVuYWJsZWQqEgipARCBARhHIghsb2dFdmVudCobCKoBEIEBGEgiEWxvZ0V2ZW50QW5kQnVuZGxlKhcIqwEQgQEYSSINbG9nSGVhbHRoRGF0YSobCKwBEIEBGEoiEW9uQWN0aXZpdHlDcmVhdGVkKh0IrQEQgQEYSyITb25BY3Rpdml0eURlc3Ryb3llZCoaCK4BEIEBGEsiEG9uQWN0aXZpdHlQYXVzZWQqGwivARCBARhLIhFvbkFjdGl2aXR5UmVzdW1lZColCLABEIEBGEwiG29uQWN0aXZpdHlTYXZlSW5zdGFuY2VTdGF0ZSobCLEBEIEBGEsiEW9uQWN0aXZpdHlTdGFydGVkKhsIsgEQgQEYSyIRb25BY3Rpdml0eVN0b3BwZWQqFwizARCBARhNIg1wZXJmb3JtQWN0aW9uKiwItAEQgQEYTiIicmVnaXN0ZXJPbk1lYXN1cmVtZW50RXZlbnRMaXN0ZW5lciocCLUBEIEBGEAiEnJlc2V0QW5hbHl0aWNzRGF0YSokCLYBEIEBGE8iGnNldENvbmRpdGlvbmFsVXNlclByb3BlcnR5KhQItwEQgQEYTyIKc2V0Q29uc2VudCoeCLgBEIEBGE8iFHNldENvbnNlbnRUaGlyZFBhcnR5KhoIuQEQgQEYUCIQc2V0Q3VycmVudFNjcmVlbioiCLoBEIEBGFEiGHNldERhdGFDb2xsZWN0aW9uRW5hYmxlZCojCLsBEIEBGFIiGXNldERlZmF1bHRFdmVudFBhcmFtZXRlcnMqHQi8ARCBARhOIhNzZXRFdmVudEludGVyY2VwdG9yKh8IvQEQgQEYUyIVc2V0SW5zdGFuY2VJZFByb3ZpZGVyKh8IvgEQgQEYVCIVc2V0TWVhc3VyZW1lbnRFbmFibGVkKiMIvwEQgQEYQCIZc2V0TWluaW11bVNlc3Npb25EdXJhdGlvbiojCMABEIEBGEAiGXNldFNlc3Npb25UaW1lb3V0RHVyYXRpb24qGgjBARCBARhVIhBzZXRTZ3RtRGVidWdJbmZvKhMIwgEQgQEYPiIJc2V0VXNlcklkKhkIwwEQgQEYViIPc2V0VXNlclByb3BlcnR5Ki4IxAEQgQEYTiIkdW5yZWdpc3Rlck9uTWVhc3VyZW1lbnRFdmVudExpc3RlbmVyKhAIxQEQkQEYBCIGPGluaXQ+KhAIxgEQkgEYBCIGPGluaXQ+KhAIxwEQkwEYBCIGPGluaXQ+KhAIyAEQlAEYBCIGPGluaXQ+KhAIyQEQlQEYBCIGPGluaXQ+KhAIygEQlgEYBCIGPGluaXQ+KhAIywEQlwEYBCIGPGluaXQ+KhAIzAEQmAEYBCIGPGluaXQ+KhAIzQEQmQEYBCIGPGluaXQ+KhAIzgEQmgEYBCIGPGluaXQ+KhAIzwEQngEYBCIGPGluaXQ+Kg0I0AEQngEYBCIDcnVuKiAI0QEQqAEYVyIWZ2V0UHJlc2VudGF0aW9uQ29udGV4dCodCNIBEKgBGFgiE3NldFByZXNlbnRhdGlvblZpZXcqJQjTARCpARhZIhtnZXRXaW5kb3dBcmVhRGlzcGxheU1ldHJpY3MqHQjUARCpARhaIhNnZXRXaW5kb3dBcmVhU3RhdHVzKjII1QEQqgEYWyIoYWRkUmVhckRpc3BsYXlQcmVzZW50YXRpb25TdGF0dXNMaXN0ZW5lciomCNYBEKoBGFsiHGFkZFJlYXJEaXNwbGF5U3RhdHVzTGlzdGVuZXIqKwjXARCqARgEIiFlbmRSZWFyRGlzcGxheVByZXNlbnRhdGlvblNlc3Npb24qHwjYARCqARgEIhVlbmRSZWFyRGlzcGxheVNlc3Npb24qHwjZARCqARhZIhVnZXRSZWFyRGlzcGxheU1ldHJpY3MqJAjaARCqARhcIhpnZXRSZWFyRGlzcGxheVByZXNlbnRhdGlvbio1CNsBEKoBGFsiK3JlbW92ZVJlYXJEaXNwbGF5UHJlc2VudGF0aW9uU3RhdHVzTGlzdGVuZXIqKQjcARCqARhbIh9yZW1vdmVSZWFyRGlzcGxheVN0YXR1c0xpc3RlbmVyKi0I3QEQqgEYXSIjc3RhcnRSZWFyRGlzcGxheVByZXNlbnRhdGlvblNlc3Npb24qIQjeARCqARhdIhdzdGFydFJlYXJEaXNwbGF5U2Vzc2lvbioQCN8BELABGF4iBmFjY2VwdCoPCOABELEBGF8iBWFwcGx5Kg4I4QEQsgEYYCIEdGVzdCoQCOIBELMBGAQiBjxpbml0PioOCOMBELMBGGEiBHJlYWQqDwjkARCzARhiIgV3cml0ZSoQCOUBELQBGAQiBjxpbml0PioOCOYBELQBGGMiBHJlYWQqDwjnARC0ARhkIgV3cml0ZSoQCOgBELYBGAQiBjxpbml0PioOCOkBELYBGGEiBHJlYWQqDwjqARC2ARhiIgV3cml0ZSoQCOsBELcBGAQiBjxpbml0PioOCOwBELcBGGMiBHJlYWQqDwjtARC3ARhkIgV3cml0ZSoQCO4BEKICGGUiBmFjY2VwdCojCO8BEKUCGGYiGWludGVybmFsQ29uaWNUb1F1YWRyYXRpY3MqJAjwARCmAhhnIhpjcmVhdGVJbnRlcm5hbFBhdGhJdGVyYXRvciolCPEBEKYCGEAiG2Rlc3Ryb3lJbnRlcm5hbFBhdGhJdGVyYXRvciolCPIBEKYCGBgiG2ludGVybmFsUGF0aEl0ZXJhdG9ySGFzTmV4dCoiCPMBEKYCGGgiGGludGVybmFsUGF0aEl0ZXJhdG9yTmV4dCoiCPQBEKYCGGkiGGludGVybmFsUGF0aEl0ZXJhdG9yUGVlayolCPUBEKYCGGkiG2ludGVybmFsUGF0aEl0ZXJhdG9yUmF3U2l6ZSoiCPYBEKYCGGkiGGludGVybmFsUGF0aEl0ZXJhdG9yU2l6ZSokCPcBEKcCGAQiGm5hdGl2ZVJlZ2lzdGVyV2l0aFBlcmZldHRvKh8I+AEQpwIYaiIVbmF0aXZlVHJhY2VFdmVudEJlZ2luKh0I+QEQpwIYBCITbmF0aXZlVHJhY2VFdmVudEVuZCoXCPoBEKcCGGsiDW5hdGl2ZVZlcnNpb24qKQj7ARCuAhhsIh9nZXRDaGltZXJhTGlmZWN5Y2xlRnJhZ21lbnRJbXBsKh0I/AEQrwIYbSITYmVnaW5BZFVuaXRFeHBvc3VyZSomCP0BEK8CGD8iHGNsZWFyQ29uZGl0aW9uYWxVc2VyUHJvcGVydHkqGwj+ARCvAhhtIhFlbmRBZFVuaXRFeHBvc3VyZSoZCP8BEK8CGBMiD2dlbmVyYXRlRXZlbnRJZCoaCIACEK8CGGsiEGdldEFwcEluc3RhbmNlSWQqJgiBAhCvAhhuIhxnZXRDb25kaXRpb25hbFVzZXJQcm9wZXJ0aWVzKh8IggIQrwIYayIVZ2V0Q3VycmVudFNjcmVlbkNsYXNzKh4IgwIQrwIYayIUZ2V0Q3VycmVudFNjcmVlbk5hbWUqFQiEAhCvAhhrIgtnZXRHbXBBcHBJZCoVCIUCEK8CGG8iC2dldEluc3RhbmNlKh4IhgIQrwIYcCIUZ2V0TWF4VXNlclByb3BlcnRpZXMqGwiHAhCvAhhxIhFnZXRVc2VyUHJvcGVydGllcyoaCIgCEK8CGD8iEGxvZ0V2ZW50SW50ZXJuYWwqJAiJAhCvAhhyIhpzZXRDb25kaXRpb25hbFVzZXJQcm9wZXJ0eSofCIoCELACGGsiFWdldEZpcmViYXNlSW5zdGFuY2VJZCoVCIsCELACGHMiC2dldEluc3RhbmNlKisIjAIQsAIYdCIhZ2V0U2Npb25Gcm9udGVuZEFwaUltcGxlbWVudGF0aW9uKhoIjQIQsAIYdSIQc2V0Q3VycmVudFNjcmVlbioUCI4CEGoYdiILZ2V0SW5zdGFuY2UqIAiPAhCxAhgEIhZvbkFwcEVudGVyZWRCYWNrZ3JvdW5kKiAIkAIQsQIYBCIWb25BcHBFbnRlcmVkRm9yZWdyb3VuZCopCJECELECGG0iH3NldExhdW5jaGVyQWN0aXZpdHlPbkNyZWF0ZVRpbWUqKQiSAhCxAhhtIh9zZXRMYXVuY2hlckFjdGl2aXR5T25SZXN1bWVUaW1lKigIkwIQsQIYbSIec2V0TGF1bmNoZXJBY3Rpdml0eU9uU3RhcnRUaW1lKhoIlAIQrAIYWiIQZGVzY3JpYmVDb250ZW50cyoWCJUCEKwCGHciDGdldEF0dHJpYnV0ZSoXCJYCEKwCGHgiDWdldEF0dHJpYnV0ZXMqFwiXAhCsAhh5Ig1nZXRMb25nTWV0cmljKhkImAIQrAIYPiIPaW5jcmVtZW50TWV0cmljKhYImQIQrAIYeiIMcHV0QXR0cmlidXRlKhMImgIQrAIYPiIJcHV0TWV0cmljKhkImwIQrAIYbSIPcmVtb3ZlQXR0cmlidXRlKg8InAIQrAIYBCIFc3RhcnQqDgidAhCsAhgEIgRzdG9wKhcIngIQrAIYeyINd3JpdGVUb1BhcmNlbCoRCJ8CELICGHwiB2V4ZWN1dGUqEQigAhCyAhh9IgdleGVjdXRlKhEIoQIQsgIYfiIHZXhlY3V0ZSoRCKICELICGH8iB2V4ZWN1dGUqEgijAhCyAhiAASIHZXhlY3V0ZSoSCKQCELICGIEBIgdleGVjdXRlKhIIpQIQsgIYggEiB2V4ZWN1dGUqEgimAhCyAhiDASIHZXhlY3V0ZSoSCKcCELMCGIQBIgdlbnF1ZXVlKhIIqAIQswIYhQEiB2V4ZWN1dGUqFQipAhC0AhiGASIKZ2V0Q29udGVudCoVCKoCELQCGIcBIgpnZXRDb250ZW50KhQIqwIQtAIYXyIKaW5zdHJ1bWVudCoVCKwCELQCGIgBIgpvcGVuU3RyZWFtKhAIrQIQtQIYiQEiBWZldGNoKhAIrgIQywIYBCIGPGluaXQ+KhAIrwIQzAIYBCIGPGluaXQ+KiUIsAIQzAIYigEiGmNvbXB1dGVBbmRTZXRUZXh0RGlyZWN0aW9uKhAIsQIQzwIYBCIGPGluaXQ+KiUIsgIQzwIYigEiGmNvbXB1dGVBbmRTZXRUZXh0RGlyZWN0aW9uKiMIswIQzwIYiwEiGGlzSG9yaXpvbnRhbGx5U2Nyb2xsYWJsZSoQCLQCENACGAQiBjxpbml0PiolCLUCENACGIoBIhpjb21wdXRlQW5kU2V0VGV4dERpcmVjdGlvbiojCLYCENACGIsBIhhpc0hvcml6b250YWxseVNjcm9sbGFibGUqGgi3AhDRAhiMASIPc2V0QmlnTGFyZ2VJY29uKhgIuAIQ1AIYjAEiDXNldEJpZ1BpY3R1cmUqIAi5AhDUAhiNASIVc2V0Q29udGVudERlc2NyaXB0aW9uKiYIugIQ1AIYjgEiG3Nob3dCaWdQaWN0dXJlV2hlbkNvbGxhcHNlZCoVCLsCENYCGI8BIgp0b1BsYXRmb3JtKhUIvAIQ2QIYjwEiCnRvUGxhdGZvcm0qEAi9AhDaAhiQASIFYnVpbGQqGAi+AhDaAhiRASINY3JlYXRlQnVpbGRlcioZCL8CENoCGJIBIg5zZXRDb250ZW50VHlwZSoTCMACENoCGJIBIghzZXRVc2FnZSokCMECEN0CGJMBIhlkaXNwYXRjaEFwcGx5V2luZG93SW5zZXRzKh4IwgIQ3QIYkwEiE29uQXBwbHlXaW5kb3dJbnNldHMqHAjDAhDdAhhYIhJyZXF1ZXN0QXBwbHlJbnNldHMqEQjEAhDfAhiUASIGPGluaXQ+Kh4IxQIQ3wIYkwEiE29uQXBwbHlXaW5kb3dJbnNldHMqKwjGAhDhAhiVASIgY2FsbENvbXBhdEluc2V0QW5pbWF0aW9uQ2FsbGJhY2sqJAjHAhDhAhiWASIZY29tcHV0ZVN5c3RlbVdpbmRvd0luc2V0cyogCMgCEOECGJcBIhVnZXRCYWNrZ3JvdW5kVGludExpc3QqIAjJAhDhAhiYASIVZ2V0QmFja2dyb3VuZFRpbnRNb2RlKhwIygIQ4QIYmQEiEWdldFRyYW5zaXRpb25OYW1lKiAIywIQ4QIYmgEiFXNldEJhY2tncm91bmRUaW50TGlzdCogCMwCEOECGJsBIhVzZXRCYWNrZ3JvdW5kVGludE1vZGUqFwjNAhDhAhicASIMc2V0RWxldmF0aW9uKikIzgIQ4QIYlAEiHnNldE9uQXBwbHlXaW5kb3dJbnNldHNMaXN0ZW5lciocCM8CEOECGJ0BIhFzZXRUcmFuc2l0aW9uTmFtZSoaCNACEOECGFgiEHN0b3BOZXN0ZWRTY3JvbGwqHgjRAhDmAhieASITZ2V0Um9vdFdpbmRvd0luc2V0cyoeCNICEOYCGJ8BIhNzZXRTY3JvbGxJbmRpY2F0b3JzKiQI0wIQ5wIYoAEiGWdldEFjY2Vzc2liaWxpdHlQYW5lVGl0bGUqIQjUAhDnAhihASIWaXNBY2Nlc3NpYmlsaXR5SGVhZGluZyoiCNUCEOcCGKEBIhdpc1NjcmVlblJlYWRlckZvY3VzYWJsZSoiCNYCEOcCGKIBIhdzZXRBY2Nlc3NpYmlsaXR5SGVhZGluZyokCNcCEOcCGKMBIhlzZXRBY2Nlc3NpYmlsaXR5UGFuZVRpdGxlKiMI2AIQ5wIYogEiGHNldFNjcmVlblJlYWRlckZvY3VzYWJsZSojCNkCEOgCGKQBIhhnZXRBY2Nlc3NpYmlsaXR5RGVsZWdhdGUqKAjaAhDoAhilASIdc2F2ZUF0dHJpYnV0ZURhdGFGb3JTdHlsZWFibGUqJAjbAhDtAhiTASIZZGlzcGF0Y2hBcHBseVdpbmRvd0luc2V0cyoeCNwCEO0CGKABIhNnZXRTdGF0ZURlc2NyaXB0aW9uKh4I3QIQ7QIYowEiE3NldFN0YXRlRGVzY3JpcHRpb24qJQjeAhDuAhimASIaZ2V0UmVjZWl2ZUNvbnRlbnRNaW1lVHlwZXMqIAjfAhDuAhinASIVcGVyZm9ybVJlY2VpdmVDb250ZW50KhAI4AIQ8QIYBCIGPGluaXQ+KhEI4QIQ8QIYqAEiBjxpbml0PioQCOICEPECGKkBIgVidWlsZColCOMCEPECGKoBIhpjcmVhdGVXaW5kb3dJbnNldHNJbnN0YW5jZSoaCOQCEPECGKsBIg9zZXRTdGFibGVJbnNldHMqIAjlAhDxAhirASIVc2V0U3lzdGVtV2luZG93SW5zZXRzKhAI5gIQ8wIYBCIGPGluaXQ+KhEI5wIQ8wIYqAEiBjxpbml0PioQCOgCEPMCGKkBIgVidWlsZCoqCOkCEPMCGKsBIh9zZXRNYW5kYXRvcnlTeXN0ZW1HZXN0dXJlSW5zZXRzKhoI6gIQ8wIYqwEiD3NldFN0YWJsZUluc2V0cyohCOsCEPMCGKsBIhZzZXRTeXN0ZW1HZXN0dXJlSW5zZXRzKiAI7AIQ8wIYqwEiFXNldFN5c3RlbVdpbmRvd0luc2V0cyojCO0CEPMCGKsBIhhzZXRUYXBwYWJsZUVsZW1lbnRJbnNldHMqEAjuAhD0AhgEIgY8aW5pdD4qEQjvAhD0AhioASIGPGluaXQ+KhQI8AIQ9AIYrAEiCXNldEluc2V0cyoQCPECEPUCGAQiBjxpbml0PioRCPICEPUCGKgBIgY8aW5pdD4qFAjzAhD1AhisASIJc2V0SW5zZXRzKhAI9AIQ9gIYBCIGPGluaXQ+KhEI9QIQ9gIYqAEiBjxpbml0PioZCPYCEPYCGAQiD2FwcGx5SW5zZXRUeXBlcyoQCPcCEPYCGKkBIgVidWlsZCoUCPgCEPYCGKwBIglzZXRJbnNldHMqKgj5AhD2AhirASIfc2V0TWFuZGF0b3J5U3lzdGVtR2VzdHVyZUluc2V0cyoaCPoCEPYCGKsBIg9zZXRTdGFibGVJbnNldHMqIQj7AhD2AhirASIWc2V0U3lzdGVtR2VzdHVyZUluc2V0cyogCPwCEPYCGKsBIhVzZXRTeXN0ZW1XaW5kb3dJbnNldHMqIwj9AhD2AhirASIYc2V0VGFwcGFibGVFbGVtZW50SW5zZXRzKhEI/gIQ9wIYrQEiBjxpbml0PioRCP8CEPcCGK4BIgY8aW5pdD4qHAiAAxD3AhhYIhJjb3B5Um9vdFZpZXdCb3VuZHMqHQiBAxD3AhioASISY29weVdpbmRvd0RhdGFJbnRvKhAIggMQ9wIYYCIGZXF1YWxzKhQIgwMQ9wIYrwEiCWdldEluc2V0cyoUCIQDEPcCGLABIglnZXRJbnNldHMqGwiFAxD3AhiwASIQZ2V0SW5zZXRzRm9yVHlwZSomCIYDEPcCGK8BIhtnZXRJbnNldHNJZ25vcmluZ1Zpc2liaWxpdHkqHgiHAxD3AhixASITZ2V0Um9vdFN0YWJsZUluc2V0cyogCIgDEPcCGLEBIhVnZXRTeXN0ZW1XaW5kb3dJbnNldHMqGwiJAxD3AhiyASIQZ2V0VmlzaWJsZUluc2V0cyoQCIoDEPcCGLMBIgVpbnNldCoRCIsDEPcCGBkiB2lzUm91bmQqGAiMAxD3Ahi0ASINaXNUeXBlVmlzaWJsZSoUCI0DEPcCGLQBIglpc1Zpc2libGUqHQiOAxD3AhgEIhNsb2FkUmVmbGVjdGlvbkZpZWxkKh4IjwMQ9wIYtQEiE3NldE92ZXJyaWRkZW5JbnNldHMqGgiQAxD3AhirASIPc2V0Um9vdFZpZXdEYXRhKh4IkQMQ9wIYqAEiE3NldFJvb3RXaW5kb3dJbnNldHMqHwiSAxD3AhgQIhVzZXRTeXN0ZW1VaVZpc2liaWxpdHkqJAiTAxD3Ahi2ASIZc3lzdGVtQmFyVmlzaWJpbGl0eUVxdWFscyoRCJQDEPkCGK0BIgY8aW5pdD4qEQiVAxD5Ahi3ASIGPGluaXQ+Kh4IlgMQ+QIYqQEiE2NvbnN1bWVTdGFibGVJbnNldHMqJAiXAxD5AhipASIZY29uc3VtZVN5c3RlbVdpbmRvd0luc2V0cyoaCJgDEPkCGLEBIg9nZXRTdGFibGVJbnNldHMqFAiZAxD5AhgZIgppc0NvbnN1bWVkKhoImgMQ+QIYqwEiD3NldFN0YWJsZUluc2V0cyoRCJsDEPoCGK0BIgY8aW5pdD4qEQicAxD6Ahi4ASIGPGluaXQ+Kh8InQMQ+gIYqQEiFGNvbnN1bWVEaXNwbGF5Q3V0b3V0KhAIngMQ+gIYYCIGZXF1YWxzKhsInwMQ+gIYuQEiEGdldERpc3BsYXlDdXRvdXQqEgigAxD6AhhaIghoYXNoQ29kZSoRCKEDEPwCGK0BIgY8aW5pdD4qEQiiAxD8Ahi6ASIGPGluaXQ+KioIowMQ/AIYsQEiH2dldE1hbmRhdG9yeVN5c3RlbUdlc3R1cmVJbnNldHMqIQikAxD8AhixASIWZ2V0U3lzdGVtR2VzdHVyZUluc2V0cyojCKUDEPwCGLEBIhhnZXRUYXBwYWJsZUVsZW1lbnRJbnNldHMqEAimAxD8AhizASIFaW5zZXQqGginAxD8AhirASIPc2V0U3RhYmxlSW5zZXRzKhEIqAMQ/QIYrQEiBjxpbml0PioRCKkDEP0CGLsBIgY8aW5pdD4qHAiqAxD9AhhYIhJjb3B5Um9vdFZpZXdCb3VuZHMqFAirAxD9AhivASIJZ2V0SW5zZXRzKiYIrAMQ/QIYrwEiG2dldEluc2V0c0lnbm9yaW5nVmlzaWJpbGl0eSoUCK0DEP0CGLQBIglpc1Zpc2libGUqEQiuAxD+AhitASIGPGluaXQ+KhEIrwMQ/gIYvAEiBjxpbml0PioUCLADEP4CGK8BIglnZXRJbnNldHMqJgixAxD+AhivASIbZ2V0SW5zZXRzSWdub3JpbmdWaXNpYmlsaXR5KhQIsgMQ/gIYtAEiCWlzVmlzaWJsZSoRCLMDEP8CGKgBIgY8aW5pdD4qHwi0AxD/AhipASIUY29uc3VtZURpc3BsYXlDdXRvdXQqHgi1AxD/AhipASITY29uc3VtZVN0YWJsZUluc2V0cyokCLYDEP8CGKkBIhljb25zdW1lU3lzdGVtV2luZG93SW5zZXRzKhwItwMQ/wIYWCISY29weVJvb3RWaWV3Qm91bmRzKh0IuAMQ/wIYqAEiEmNvcHlXaW5kb3dEYXRhSW50byoQCLkDEP8CGGAiBmVxdWFscyobCLoDEP8CGLkBIhBnZXREaXNwbGF5Q3V0b3V0KhQIuwMQ/wIYrwEiCWdldEluc2V0cyomCLwDEP8CGK8BIhtnZXRJbnNldHNJZ25vcmluZ1Zpc2liaWxpdHkqKgi9AxD/AhixASIfZ2V0TWFuZGF0b3J5U3lzdGVtR2VzdHVyZUluc2V0cyoaCL4DEP8CGLEBIg9nZXRTdGFibGVJbnNldHMqIQi/AxD/AhixASIWZ2V0U3lzdGVtR2VzdHVyZUluc2V0cyogCMADEP8CGLEBIhVnZXRTeXN0ZW1XaW5kb3dJbnNldHMqIwjBAxD/AhixASIYZ2V0VGFwcGFibGVFbGVtZW50SW5zZXRzKhIIwgMQ/wIYWiIIaGFzaENvZGUqEAjDAxD/AhizASIFaW5zZXQqFAjEAxD/AhgZIgppc0NvbnN1bWVkKhEIxQMQ/wIYGSIHaXNSb3VuZCoUCMYDEP8CGLQBIglpc1Zpc2libGUqHgjHAxD/Ahi1ASITc2V0T3ZlcnJpZGRlbkluc2V0cyoaCMgDEP8CGKsBIg9zZXRSb290Vmlld0RhdGEqHgjJAxD/AhioASITc2V0Um9vdFdpbmRvd0luc2V0cyoaCMoDEP8CGKsBIg9zZXRTdGFibGVJbnNldHMqHwjLAxD/AhgQIhVzZXRTeXN0ZW1VaVZpc2liaWxpdHkqGQjMAxCAAxi9ASIOdG9QbGF0Zm9ybVR5cGUqGQjNAxCBAxi9ASIOdG9QbGF0Zm9ybVR5cGUqEQjOAxCCAxi+ASIGb25QdWxsKhEIzwMQhAMYvwEiBmNyZWF0ZSoWCNADEIQDGMABIgtnZXREaXN0YW5jZSoZCNEDEIQDGMEBIg5vblB1bGxEaXN0YW5jZSoYCNIDEIUDGFgiDnNldENvbnRlbnRWaWV3KhgI0wMQhgMYWCIOc2V0Q29udGVudFZpZXcqHAjUAxCTAxjCASIRb25BY3Rpdml0eUNyZWF0ZWQqHgjVAxCTAxjDASITb25BY3Rpdml0eURlc3Ryb3llZCobCNYDEJMDGMMBIhBvbkFjdGl2aXR5UGF1c2VkKhwI1wMQkwMYwwEiEW9uQWN0aXZpdHlSZXN1bWVkKiYI2AMQkwMYwgEiG29uQWN0aXZpdHlTYXZlSW5zdGFuY2VTdGF0ZSocCNkDEJMDGMMBIhFvbkFjdGl2aXR5U3RhcnRlZCocCNoDEJMDGMMBIhFvbkFjdGl2aXR5U3RvcHBlZCoQCNsDEJQDGAQiBjxpbml0PiocCNwDEJQDGMIBIhFvbkFjdGl2aXR5Q3JlYXRlZCoRCN0DEJADGMQBIgY8aW5pdD4qIAjeAxCQAxjDASIVb25BY3Rpdml0eVBvc3RSZXN1bWVkKiAI3wMQkAMYwwEiFW9uQWN0aXZpdHlQb3N0U3RhcnRlZCoRCOADEJIDGMQBIgY8aW5pdD4qHAjhAxCSAxjCASIRb25BY3Rpdml0eUNyZWF0ZWQqGwjiAxCSAxjDASIQb25BY3Rpdml0eVBhdXNlZCofCOMDEJIDGMIBIhRvbkFjdGl2aXR5UHJlQ3JlYXRlZCocCOQDEJIDGMMBIhFvbkFjdGl2aXR5U3RvcHBlZCoQCOUDEJUDGAQiBjxpbml0PiogCOYDEIkEGAQiFmRpc3BhdGNoR2V0RGlzcGxheUxpc3QqLQjnAxCKBBjFASIiZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZFRyYXZlcnNhbCoQCOgDEIsEGAQiBjxpbml0PiocCOkDEIsEGMIBIhFvbkFjdGl2aXR5Q3JlYXRlZCoeCOoDEIsEGMMBIhNvbkFjdGl2aXR5RGVzdHJveWVkKhsI6wMQiwQYwwEiEG9uQWN0aXZpdHlQYXVzZWQqIAjsAxCLBBjCASIVb25BY3Rpdml0eVBvc3RDcmVhdGVkKiAI7QMQiwQYwwEiFW9uQWN0aXZpdHlQb3N0UmVzdW1lZCogCO4DEIsEGMMBIhVvbkFjdGl2aXR5UG9zdFN0YXJ0ZWQqIQjvAxCLBBjDASIWb25BY3Rpdml0eVByZURlc3Ryb3llZCoeCPADEIsEGMMBIhNvbkFjdGl2aXR5UHJlUGF1c2VkKh8I8QMQiwQYwwEiFG9uQWN0aXZpdHlQcmVTdG9wcGVkKhwI8gMQiwQYwwEiEW9uQWN0aXZpdHlSZXN1bWVkKiYI8wMQiwQYwgEiG29uQWN0aXZpdHlTYXZlSW5zdGFuY2VTdGF0ZSocCPQDEIsEGMMBIhFvbkFjdGl2aXR5U3RhcnRl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bHVlcyoSCIgHELoHGLMEIgd2YWx1ZU9mKhEIiQcQugcYtAQiBnZhbHVlcyoSCIoHELwHGLUEIgd2YWx1ZU9mKhEIiwcQvAcYtgQiBnZhbHVlcyoSCIwHEL4HGLcEIgd2YWx1ZU9mKhEIjQcQvgcYuAQiBnZhbHVlcyoSCI4HEMAHGLkEIgd2YWx1ZU9mKhEIjwcQwAcYugQiBnZhbHVlcyokCJAHEMQHGLsEIhlnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKhYIkQcQxAcYvAQiC2dldEl0ZW1EYXRhKhYIkgcQxAcYUSIMc2V0Q2hlY2thYmxlKhQIkwcQxAcYUSIKc2V0Q2hlY2tlZCobCJQHEMQHGFEiEXNldEV4cGFuZGVkRm9ybWF0KhIIlQcQxAcYvQQiB3NldEljb24qGQiWBxDEBxi+BCIOc2V0SXRlbUludm9rZXIqGwiXBxDEBxi/BCIQc2V0UG9wdXBDYWxsYmFjayoTCJgHEMQHGMAEIghzZXRUaXRsZSodCJkHEMkHGFoiE2dldFdpbmRvd0FuaW1hdGlvbnMqFgiaBxDKBxjBBCILZ2V0SW5mbGF0ZXIqFgibBxDKBxi8BCILZ2V0SXRlbURhdGEqFgicBxDKBxhRIgxzZXRDaGVja2FibGUqFAidBxDKBxhRIgpzZXRDaGVja2VkKhoIngcQygcYUSIQc2V0Rm9yY2VTaG93SWNvbiogCJ8HEMoHGFEiFnNldEdyb3VwRGl2aWRlckVuYWJsZWQqEgigBxDKBxi9BCIHc2V0SWNvbiogCKEHEMoHGFEiFnNldFN1Yk1lbnVBcnJvd1Zpc2libGUqEwiiBxDKBxjABCIIc2V0VGl0bGUqGgijBxDMBxjCBCIPZ2V0VGFiQ29udGFpbmVyKh8IpAcQzAcYvQQiFHNldFByaW1hcnlCYWNrZ3JvdW5kKh0IpQcQzAcYvQQiEnNldFNwbGl0QmFja2dyb3VuZCofCKYHEMwHGL0EIhRzZXRTdGFja2VkQmFja2dyb3VuZCoaCKcHEMwHGMMEIg9zZXRUYWJDb250YWluZXIqGgioBxDMBxhRIhBzZXRUcmFuc2l0aW9uaW5nKhcIqQcQzAcYECINc2V0VmlzaWJpbGl0eSofCKoHEM4HGFoiFWdldEFuaW1hdGVkVmlzaWJpbGl0eSoaCKsHEM4HGFoiEGdldENvbnRlbnRIZWlnaHQqFgisBxDOBxi7BCILZ2V0U3VidGl0bGUqEwitBxDOBxi7BCIIZ2V0VGl0bGUqGgiuBxDOBxgQIhBzZXRDb250ZW50SGVpZ2h0KhcIrwcQzgcYWCINc2V0Q3VzdG9tVmlldyoWCLAHEM4HGMAEIgtzZXRTdWJ0aXRsZSoTCLEHEM4HGMAEIghzZXRUaXRsZSoaCLIHEM4HGFEiEHNldFRpdGxlT3B0aW9uYWwqFwizBxDOBxgQIg1zZXRWaXNpYmlsaXR5KiAItAcQzwcYWiIWZ2V0QWN0aW9uQmFySGlkZU9mZnNldCodCLUHEM8HGFoiE2dldE5lc3RlZFNjcm9sbEF4ZXMqEwi2BxDPBxi7BCIIZ2V0VGl0bGUqIAi3BxDPBxgQIhZzZXRBY3Rpb25CYXJIaWRlT2Zmc2V0KikIuAcQzwcYxAQiHnNldEFjdGlvbkJhclZpc2liaWxpdHlDYWxsYmFjayofCLkHEM8HGFEiFXNldEhhc05vbkVtYmVkZGVkVGFicyonCLoHEM8HGFEiHXNldEhpZGVPbkNvbnRlbnRTY3JvbGxFbmFibGVkKhEIuwcQzwcYECIHc2V0SWNvbioSCLwHEM8HGL0EIgdzZXRJY29uKhEIvQcQzwcYECIHc2V0TG9nbyoYCL4HEM8HGFEiDnNldE92ZXJsYXlNb2RlKiEIvwcQzwcYUSIXc2V0U2hvd2luZ0ZvckFjdGlvbk1vZGUqFgjABxDPBxgQIgxzZXRVaU9wdGlvbnMqHAjBBxDPBxjFBCIRc2V0V2luZG93Q2FsbGJhY2sqGQjCBxDPBxjABCIOc2V0V2luZG93VGl0bGUqEgjDBxDSBxjGBCIHZ2V0TWVudSoaCMQHENIHGMcEIg9nZXRPdmVyZmxvd0ljb24qFwjFBxDSBxhaIg1nZXRQb3B1cFRoZW1lKh0IxgcQ0gcYWiITZ2V0V2luZG93QW5pbWF0aW9ucyopCMcHENIHGFEiH3NldEV4cGFuZGVkQWN0aW9uVmlld3NFeGNsdXNpdmUqJQjIBxDSBxjIBCIac2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIqGgjJBxDSBxi9BCIPc2V0T3ZlcmZsb3dJY29uKh0IygcQ0gcYUSITc2V0T3ZlcmZsb3dSZXNlcnZlZCoXCMsHENIHGBAiDXNldFBvcHVwVGhlbWUqFwjMBxDSBxjJBCIMc2V0UHJlc2VudGVyKi8IzQcQ1gcYygQiJGdldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayonCM4HENYHGMsEIhxnZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRMaXN0KicIzwcQ1gcYzAQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludE1vZGUqLgjQBxDWBxjLBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgjRBxDWBxjMBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqIAjSBxDWBxi9BCIVc2V0QmFja2dyb3VuZERyYXdhYmxlKh8I0wcQ1gcYECIVc2V0QmFja2dyb3VuZFJlc291cmNlKi8I1AcQ1gcYzQQiJHNldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayonCNUHENYHGBAiHXNldERyb3BEb3duQmFja2dyb3VuZFJlc291cmNlKh8I1gcQ1gcYUSIVc2V0RW1vamlDb21wYXRFbmFibGVkKhkI1wcQ1gcYzgQiDnNldEtleUxpc3RlbmVyKicI2AcQ1gcYzwQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwjZBxDWBxjQBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCNoHENYHGM8EIiNzZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCNsHENYHGNAEIiNzZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSogCNwHENkHGFoiFmdldEF1dG9TaXplTWF4VGV4dFNpemUqIAjdBxDZBxhaIhZnZXRBdXRvU2l6ZU1pblRleHRTaXplKiQI3gcQ2QcYWiIaZ2V0QXV0b1NpemVTdGVwR3JhbnVsYXJpdHkqKAjfBxDZBxjRBCIdZ2V0QXV0b1NpemVUZXh0QXZhaWxhYmxlU2l6ZXMqHQjgBxDZBxhaIhNnZXRBdXRvU2l6ZVRleHRUeXBlKi8I4QcQ2QcYygQiJGdldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayohCOIHENkHGNIEIhZnZXRFbW9qaVRleHRWaWV3SGVscGVyKicI4wcQ2QcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwjkBxDZBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCOUHENkHGMsEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCOYHENkHGMwEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSoUCOcHENkHGFEiCnNldEFsbENhcHMqKQjoBxDZBxgQIh9zZXRBdXRvU2l6ZVRleHRUeXBlV2l0aERlZmF1bHRzKiAI6QcQ2QcYvQQiFXNldEJhY2tncm91bmREcmF3YWJsZSofCOoHENkHGBAiFXNldEJhY2tncm91bmRSZXNvdXJjZSovCOsHENkHGM0EIiRzZXRDdXN0b21TZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2sqHwjsBxDZBxhRIhVzZXRFbW9qaUNvbXBhdEVuYWJsZWQqFQjtBxDZBxjTBCIKc2V0RmlsdGVycyobCO4HENkHGFEiEXNldFN1cHBvcnRBbGxDYXBzKicI7wcQ2QcYzwQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwjwBxDZBxjQBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCPEHENkHGM8EIiNzZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCPIHENkHGNAEIiNzZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSohCPMHENwHGNIEIhZnZXRFbW9qaVRleHRWaWV3SGVscGVyKicI9AcQ3AcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwj1BxDcBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSojCPYHENwHGMsEIhhnZXRTdXBwb3J0QnV0dG9uVGludExpc3QqIwj3BxDcBxjMBCIYZ2V0U3VwcG9ydEJ1dHRvblRpbnRNb2RlKi4I+AcQ3AcYywQiI2dldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRMaXN0Ki4I+QcQ3AcYzAQiI2dldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRNb2RlKhQI+gcQ3AcYUSIKc2V0QWxsQ2FwcyogCPsHENwHGL0EIhVzZXRCYWNrZ3JvdW5kRHJhd2FibGUqHwj8BxDcBxgQIhVzZXRCYWNrZ3JvdW5kUmVzb3VyY2UqGwj9BxDcBxgQIhFzZXRCdXR0b25EcmF3YWJsZSocCP4HENwHGL0EIhFzZXRCdXR0b25EcmF3YWJsZSofCP8HENwHGFEiFXNldEVtb2ppQ29tcGF0RW5hYmxlZCoVCIAIENwHGNMEIgpzZXRGaWx0ZXJzKicIgQgQ3AcYzwQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwiCCBDcBxjQBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSojCIMIENwHGM8EIhhzZXRTdXBwb3J0QnV0dG9uVGludExpc3QqIwiECBDcBxjQBCIYc2V0U3VwcG9ydEJ1dHRvblRpbnRNb2RlKi4IhQgQ3AcYzwQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRMaXN0Ki4IhggQ3AcY0AQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRNb2RlKi8IhwgQ3QcYygQiJGdldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayohCIgIEN0HGNIEIhZnZXRFbW9qaVRleHRWaWV3SGVscGVyKicIiQgQ3QcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwiKCBDdBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSomCIsIEN0HGMsEIhtnZXRTdXBwb3J0Q2hlY2tNYXJrVGludExpc3QqJgiMCBDdBxjMBCIbZ2V0U3VwcG9ydENoZWNrTWFya1RpbnRNb2RlKi4IjQgQ3QcYywQiI2dldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRMaXN0Ki4IjggQ3QcYzAQiI2dldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRNb2RlKhQIjwgQ3QcYUSIKc2V0QWxsQ2FwcyogCJAIEN0HGL0EIhVzZXRCYWNrZ3JvdW5kRHJhd2FibGUqHwiRCBDdBxgQIhVzZXRCYWNrZ3JvdW5kUmVzb3VyY2UqHgiSCBDdBxgQIhRzZXRDaGVja01hcmtEcmF3YWJsZSofCJMIEN0HGL0EIhRzZXRDaGVja01hcmtEcmF3YWJsZSovCJQIEN0HGM0EIiRzZXRDdXN0b21TZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2sqHwiVCBDdBxhRIhVzZXRFbW9qaUNvbXBhdEVuYWJsZWQqJwiWCBDdBxjPBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCJcIEN0HGNAEIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKiYImAgQ3QcYzwQiG3NldFN1cHBvcnRDaGVja01hcmtUaW50TGlzdComCJkIEN0HGNAEIhtzZXRTdXBwb3J0Q2hlY2tNYXJrVGludE1vZGUqLgiaCBDdBxjPBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgibCBDdBxjQBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqLwicCBDeBxjKBCIkZ2V0Q3VzdG9tU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrKhkInQgQ3gcY1AQiDmdldFN1cGVyQ2FsbGVyKicInggQ3gcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwifCBDeBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCKAIEN4HGMsEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCKEIEN4HGMwEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSoSCKIIEN4HGNUEIgdnZXRUZXh0KhIIowgQ3gcYuwQiB2dldFRleHQqHAikCBDeBxjWBCIRZ2V0VGV4dENsYXNzaWZpZXIqIAilCBDeBxi9BCIVc2V0QmFja2dyb3VuZERyYXdhYmxlKh8IpggQ3gcYECIVc2V0QmFja2dyb3VuZFJlc291cmNlKi8IpwgQ3gcYzQQiJHNldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayofCKgIEN4HGFEiFXNldEVtb2ppQ29tcGF0RW5hYmxlZCoZCKkIEN4HGM4EIg5zZXRLZXlMaXN0ZW5lcionCKoIEN4HGM8EIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRMaXN0KicIqwgQ3gcY0AQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludE1vZGUqLgisCBDeBxjPBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgitCBDeBxjQBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqHAiuCBDeBxjXBCIRc2V0VGV4dENsYXNzaWZpZXIqJwivCBDiBxjLBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCLAIEOIHGMwEIhxnZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKiIIsQgQ4gcYywQiF2dldFN1cHBvcnRJbWFnZVRpbnRMaXN0KiIIsggQ4gcYzAQiF2dldFN1cHBvcnRJbWFnZVRpbnRNb2RlKiAIswgQ4gcYvQQiFXNldEJhY2tncm91bmREcmF3YWJsZSofCLQIEOIHGBAiFXNldEJhY2tncm91bmRSZXNvdXJjZSoZCLUIEOIHGNgEIg5zZXRJbWFnZUJpdG1hcCobCLYIEOIHGL0EIhBzZXRJbWFnZURyYXdhYmxlKhcItwgQ4gcYECINc2V0SW1hZ2VMZXZlbCoaCLgIEOIHGBAiEHNldEltYWdlUmVzb3VyY2UqFgi5CBDiBxjZBCILc2V0SW1hZ2VVUkkqJwi6CBDiBxjPBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCLsIEOIHGNAEIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKiIIvAgQ4gcYzwQiF3NldFN1cHBvcnRJbWFnZVRpbnRMaXN0KiIIvQgQ4gcY0AQiF3NldFN1cHBvcnRJbWFnZVRpbnRNb2RlKicIvggQ5QcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwi/CBDlBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSoiCMAIEOUHGMsEIhdnZXRTdXBwb3J0SW1hZ2VUaW50TGlzdCoiCMEIEOUHGMwEIhdnZXRTdXBwb3J0SW1hZ2VUaW50TW9kZSogCMIIEOUHGL0EIhVzZXRCYWNrZ3JvdW5kRHJhd2FibGUqHwjDCBDlBxgQIhVzZXRCYWNrZ3JvdW5kUmVzb3VyY2UqGQjECBDlBxjYBCIOc2V0SW1hZ2VCaXRtYXAqGwjFCBDlBxi9BCIQc2V0SW1hZ2VEcmF3YWJsZSoXCMYIEOUHGBAiDXNldEltYWdlTGV2ZWwqGgjHCBDlBxgQIhBzZXRJbWFnZVJlc291cmNlKhYIyAgQ5QcY2QQiC3NldEltYWdlVVJJKicIyQgQ5QcYzwQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwjKCBDlBxjQBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSoiCMsIEOUHGM8EIhdzZXRTdXBwb3J0SW1hZ2VUaW50TGlzdCoiCMwIEOUHGNAEIhdzZXRTdXBwb3J0SW1hZ2VUaW50TW9kZSonCM0IEOYHGMsEIhxnZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRMaXN0KicIzggQ5gcYzAQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludE1vZGUqLgjPCBDmBxjLBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgjQCBDmBxjMBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqIAjRCBDmBxi9BCIVc2V0QmFja2dyb3VuZERyYXdhYmxlKh8I0ggQ5gcYECIVc2V0QmFja2dyb3VuZFJlc291cmNlKicI0wgQ5gcYECIdc2V0RHJvcERvd25CYWNrZ3JvdW5kUmVzb3VyY2UqHwjUCBDmBxhRIhVzZXRFbW9qaUNvbXBhdEVuYWJsZWQqGQjVCBDmBxjOBCIOc2V0S2V5TGlzdGVuZXIqJwjWCBDmBxjPBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCNcIEOYHGNAEIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKi4I2AgQ5gcYzwQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRMaXN0Ki4I2QgQ5gcY0AQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRNb2RlKiEI2ggQ5wcY0gQiFmdldEVtb2ppVGV4dFZpZXdIZWxwZXIqJwjbCBDnBxjLBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCNwIEOcHGMwEIhxnZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKiMI3QgQ5wcYywQiGGdldFN1cHBvcnRCdXR0b25UaW50TGlzdCojCN4IEOcHGMwEIhhnZXRTdXBwb3J0QnV0dG9uVGludE1vZGUqLgjfCBDnBxjLBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgjgCBDnBxjMBCIjZ2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqFAjhCBDnBxhRIgpzZXRBbGxDYXBzKiAI4ggQ5wcYvQQiFXNldEJhY2tncm91bmREcmF3YWJsZSofCOMIEOcHGBAiFXNldEJhY2tncm91bmRSZXNvdXJjZSobCOQIEOcHGBAiEXNldEJ1dHRvbkRyYXdhYmxlKhwI5QgQ5wcYvQQiEXNldEJ1dHRvbkRyYXdhYmxlKh8I5ggQ5wcYUSIVc2V0RW1vamlDb21wYXRFbmFibGVkKhUI5wgQ5wcY0wQiCnNldEZpbHRlcnMqJwjoCBDnBxjPBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCOkIEOcHGNAEIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKiMI6ggQ5wcYzwQiGHNldFN1cHBvcnRCdXR0b25UaW50TGlzdCojCOsIEOcHGNAEIhhzZXRTdXBwb3J0QnV0dG9uVGludE1vZGUqLgjsCBDnBxjPBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgjtCBDnBxjQBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqJQjuCBDoBxhaIhtnZXREcm9wRG93bkhvcml6b250YWxPZmZzZXQqIwjvCBDoBxhaIhlnZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KhoI8AgQ6AcYWiIQZ2V0RHJvcERvd25XaWR0aCobCPEIEOgHGNoEIhBnZXRJbnRlcm5hbFBvcHVwKh0I8ggQ6AcYxwQiEmdldFBvcHVwQmFja2dyb3VuZCoZCPMIEOgHGFciD2dldFBvcHVwQ29udGV4dCoUCPQIEOgHGLsEIglnZXRQcm9tcHQqJwj1CBDoBxjLBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCPYIEOgHGMwEIhxnZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKhUI9wgQ6AcY2wQiCnNldEFkYXB0ZXIqFQj4CBDoBxjcBCIKc2V0QWRhcHRlciogCPkIEOgHGL0EIhVzZXRCYWNrZ3JvdW5kRHJhd2FibGUqHwj6CBDoBxgQIhVzZXRCYWNrZ3JvdW5kUmVzb3VyY2UqJQj7CBDoBxgQIhtzZXREcm9wRG93bkhvcml6b250YWxPZmZzZXQqIwj8CBDoBxgQIhlzZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KhoI/QgQ6AcYECIQc2V0RHJvcERvd25XaWR0aColCP4IEOgHGL0EIhpzZXRQb3B1cEJhY2tncm91bmREcmF3YWJsZSokCP8IEOgHGBAiGnNldFBvcHVwQmFja2dyb3VuZFJlc291cmNlKhQIgAkQ6AcYwAQiCXNldFByb21wdConCIEJEOgHGM8EIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRMaXN0KicIggkQ6AcY0AQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludE1vZGUqIAiDCRDsBxhaIhZnZXRBdXRvU2l6ZU1heFRleHRTaXplKiAIhAkQ7AcYWiIWZ2V0QXV0b1NpemVNaW5UZXh0U2l6ZSokCIUJEOwHGFoiGmdldEF1dG9TaXplU3RlcEdyYW51bGFyaXR5KigIhgkQ7AcY0QQiHWdldEF1dG9TaXplVGV4dEF2YWlsYWJsZVNpemVzKh0IhwkQ7AcYWiITZ2V0QXV0b1NpemVUZXh0VHlwZSovCIgJEOwHGMoEIiRnZXRDdXN0b21TZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2sqIQiJCRDsBxjSBCIWZ2V0RW1vamlUZXh0Vmlld0hlbHBlciolCIoJEOwHGFoiG2dldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodConCIsJEOwHGFoiHWdldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KhkIjAkQ7AcY3QQiDmdldFN1cGVyQ2FsbGVyKicIjQkQ7AcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwiOCRDsBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCI8JEOwHGMsEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCJAJEOwHGMwEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSoSCJEJEOwHGLsEIgdnZXRUZXh0KhwIkgkQ7AcY1gQiEWdldFRleHRDbGFzc2lmaWVyKiUIkwkQ7AcY3gQiGmdldFRleHRNZXRyaWNzUGFyYW1zQ29tcGF0KhQIlAkQ7AcYUSIKc2V0QWxsQ2FwcyopCJUJEOwHGBAiH3NldEF1dG9TaXplVGV4dFR5cGVXaXRoRGVmYXVsdHMqIAiWCRDsBxi9BCIVc2V0QmFja2dyb3VuZERyYXdhYmxlKh8IlwkQ7AcYECIVc2V0QmFja2dyb3VuZFJlc291cmNlKi8ImAkQ7AcYzQQiJHNldEN1c3RvbVNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayofCJkJEOwHGFEiFXNldEVtb2ppQ29tcGF0RW5hYmxlZCoVCJoJEOwHGNMEIgpzZXRGaWx0ZXJzKiUImwkQ7AcYECIbc2V0Rmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KicInAkQ7AcYECIdc2V0TGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQqFwidCRDsBxgQIg1zZXRMaW5lSGVpZ2h0Kh0IngkQ7AcY3wQiEnNldFByZWNvbXB1dGVkVGV4dConCJ8JEOwHGM8EIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRMaXN0KicIoAkQ7AcY0AQiHHNldFN1cHBvcnRCYWNrZ3JvdW5kVGludE1vZGUqLgihCRDsBxjPBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludExpc3QqLgiiCRDsBxjQBCIjc2V0U3VwcG9ydENvbXBvdW5kRHJhd2FibGVzVGludE1vZGUqHAijCRDsBxjXBCIRc2V0VGV4dENsYXNzaWZpZXIqGAikCRDsBxjgBCINc2V0VGV4dEZ1dHVyZSolCKUJEOwHGOEEIhpzZXRUZXh0TWV0cmljc1BhcmFtc0NvbXBhdCohCKYJEPAHGNIEIhZnZXRFbW9qaVRleHRWaWV3SGVscGVyKicIpwkQ8AcYywQiHGdldFN1cHBvcnRCYWNrZ3JvdW5kVGludExpc3QqJwioCRDwBxjMBCIcZ2V0U3VwcG9ydEJhY2tncm91bmRUaW50TW9kZSouCKkJEPAHGMsEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TGlzdCouCKoJEPAHGMwEIiNnZXRTdXBwb3J0Q29tcG91bmREcmF3YWJsZXNUaW50TW9kZSoUCKsJEPAHGFEiCnNldEFsbENhcHMqIAisCRDwBxi9BCIVc2V0QmFja2dyb3VuZERyYXdhYmxlKh8IrQkQ8AcYECIVc2V0QmFja2dyb3VuZFJlc291cmNlKh8IrgkQ8AcYUSIVc2V0RW1vamlDb21wYXRFbmFibGVkKhUIrwkQ8AcY0wQiCnNldEZpbHRlcnMqJwiwCRDwBxjPBCIcc2V0U3VwcG9ydEJhY2tncm91bmRUaW50TGlzdConCLEJEPAHGNAEIhxzZXRTdXBwb3J0QmFja2dyb3VuZFRpbnRNb2RlKi4IsgkQ8AcYzwQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRMaXN0Ki4IswkQ8AcY0AQiI3NldFN1cHBvcnRDb21wb3VuZERyYXdhYmxlc1RpbnRNb2RlKhoItAkQ8QcYUSIQc2V0QWxsb3dTdGFja2luZyoUCLUJEPEHGFEiCnNldFN0YWNrZWQqHgi2CRDyBxjiBCITZ2V0Rml4ZWRIZWlnaHRNYWpvcioeCLcJEPIHGOIEIhNnZXRGaXhlZEhlaWdodE1pbm9yKh0IuAkQ8gcY4gQiEmdldEZpeGVkV2lkdGhNYWpvciodCLkJEPIHGOIEIhJnZXRGaXhlZFdpZHRoTWlub3IqGwi6CRDyBxjiBCIQZ2V0TWluV2lkdGhNYWpvciobCLsJEPIHGOIEIhBnZXRNaW5XaWR0aE1pbm9yKhwIvAkQ8gcY4wQiEXNldEF0dGFjaExpc3RlbmVyKiAIvQkQ9QcYUSIWc2V0TGlzdFNlbGVjdGlvbkhpZGRlbiooCL4JEPYHGOQEIh1zZXRPbkZpdFN5c3RlbVdpbmRvd3NMaXN0ZW5lciooCL8JEPgHGOQEIh1zZXRPbkZpdFN5c3RlbVdpbmRvd3NMaXN0ZW5lcioVCMAJEPkHGFoiC2dldEJhc2VsaW5lKiYIwQkQ+QcYWiIcZ2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCodCMIJEPkHGMcEIhJnZXREaXZpZGVyRHJhd2FibGUqGwjDCRD5BxhaIhFnZXREaXZpZGVyUGFkZGluZyoZCMQJEPkHGFoiD2dldERpdmlkZXJXaWR0aCoUCMUJEPkHGFoiCmdldEdyYXZpdHkqGAjGCRD5BxhaIg5nZXRPcmllbnRhdGlvbioZCMcJEPkHGFoiD2dldFNob3dEaXZpZGVycyoeCMgJEPkHGFoiFGdldFZpcnR1YWxDaGlsZENvdW50KhcIyQkQ+QcYxgEiDGdldFdlaWdodFN1bSocCMoJEPkHGFEiEnNldEJhc2VsaW5lQWxpZ25lZComCMsJEPkHGBAiHHNldEJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgqHQjMCRD5Bxi9BCISc2V0RGl2aWRlckRyYXdhYmxlKhsIzQkQ+QcYECIRc2V0RGl2aWRlclBhZGRpbmcqFAjOCRD5BxgQIgpzZXRHcmF2aXR5Kh4IzwkQ+QcYECIUc2V0SG9yaXpvbnRhbEdyYXZpdHkqKwjQCRD5BxhRIiFzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQqGAjRCRD5BxgQIg5zZXRPcmllbnRhdGlvbioZCNIJEPkHGBAiD3NldFNob3dEaXZpZGVycyocCNMJEPkHGBAiEnNldFZlcnRpY2FsR3Jhdml0eSoXCNQJEPkHGMcBIgxzZXRXZWlnaHRTdW0qGwjVCRD6BxjlBCIQc2V0SG92ZXJMaXN0ZW5lcioWCNYJEPoHGL0EIgtzZXRTZWxlY3RvciolCNcJEPwHGFoiG2dldFNlYXJjaFZpZXdUZXh0TWluV2lkdGhEcCoaCNgJEPwHGFEiEHNldEltZVZpc2liaWxpdHkqGAjZCRD8BxjmBCINc2V0U2VhcmNoVmlldyoWCNoJEPwHGBAiDHNldFRocmVzaG9sZCooCNsJEP4HGLsEIh1nZXRDb2xsYXBzZUNvbnRlbnREZXNjcmlwdGlvbioaCNwJEP4HGMcEIg9nZXRDb2xsYXBzZUljb24qHAjdCRD+BxhaIhJnZXRDb250ZW50SW5zZXRFbmQqJwjeCRD+BxhaIh1nZXRDb250ZW50SW5zZXRFbmRXaXRoQWN0aW9ucyodCN8JEP4HGFoiE2dldENvbnRlbnRJbnNldExlZnQqHgjgCRD+BxhaIhRnZXRDb250ZW50SW5zZXRSaWdodCoeCOEJEP4HGFoiFGdldENvbnRlbnRJbnNldFN0YXJ0KiwI4gkQ/gcYWiIiZ2V0Q29udGVudEluc2V0U3RhcnRXaXRoTmF2aWdhdGlvbiojCOMJEP4HGFoiGWdldEN1cnJlbnRDb250ZW50SW5zZXRFbmQqJAjkCRD+BxhaIhpnZXRDdXJyZW50Q29udGVudEluc2V0TGVmdColCOUJEP4HGFoiG2dldEN1cnJlbnRDb250ZW50SW5zZXRSaWdodColCOYJEP4HGFoiG2dldEN1cnJlbnRDb250ZW50SW5zZXRTdGFydCoeCOcJEP4HGOcEIhNnZXRDdXJyZW50TWVudUl0ZW1zKhII6AkQ/gcYxwQiB2dldExvZ28qHQjpCRD+Bxi7BCISZ2V0TG9nb0Rlc2NyaXB0aW9uKhII6gkQ/gcYxgQiB2dldE1lbnUqGgjrCRD+BxjoBCIPZ2V0TWVudUluZmxhdGVyKhsI7AkQ/gcYwgQiEGdldE5hdkJ1dHRvblZpZXcqKgjtCRD+Bxi7BCIfZ2V0TmF2aWdhdGlvbkNvbnRlbnREZXNjcmlwdGlvbiocCO4JEP4HGMcEIhFnZXROYXZpZ2F0aW9uSWNvbiomCO8JEP4HGOkEIhtnZXRPdXRlckFjdGlvbk1lbnVQcmVzZW50ZXIqGgjwCRD+BxjHBCIPZ2V0T3ZlcmZsb3dJY29uKhkI8QkQ/gcYVyIPZ2V0UG9wdXBDb250ZXh0KhcI8gkQ/gcYWiINZ2V0UG9wdXBUaGVtZSoWCPMJEP4HGLsEIgtnZXRTdWJ0aXRsZSoeCPQJEP4HGOoEIhNnZXRTdWJ0aXRsZVRleHRWaWV3KhMI9QkQ/gcYuwQiCGdldFRpdGxlKh4I9gkQ/gcYWiIUZ2V0VGl0bGVNYXJnaW5Cb3R0b20qGwj3CRD+BxhaIhFnZXRUaXRsZU1hcmdpbkVuZCodCPgJEP4HGFoiE2dldFRpdGxlTWFyZ2luU3RhcnQqGwj5CRD+BxhaIhFnZXRUaXRsZU1hcmdpblRvcCobCPoJEP4HGOoEIhBnZXRUaXRsZVRleHRWaWV3KhUI+wkQ/gcY6wQiCmdldFdyYXBwZXIqJwj8CRD+BxhRIh1zZXRCYWNrSW52b2tlZENhbGxiYWNrRW5hYmxlZConCP0JEP4HGBAiHXNldENvbGxhcHNlQ29udGVudERlc2NyaXB0aW9uKigI/gkQ/gcYwAQiHXNldENvbGxhcHNlQ29udGVudERlc2NyaXB0aW9uKhkI/wkQ/gcYECIPc2V0Q29sbGFwc2VJY29uKhoIgAoQ/gcYvQQiD3NldENvbGxhcHNlSWNvbioYCIEKEP4HGFEiDnNldENvbGxhcHNpYmxlKicIggoQ/gcYECIdc2V0Q29udGVudEluc2V0RW5kV2l0aEFjdGlvbnMqLAiDChD+BxgQIiJzZXRDb250ZW50SW5zZXRTdGFydFdpdGhOYXZpZ2F0aW9uKhEIhAoQ/gcYECIHc2V0TG9nbyoSCIUKEP4HGL0EIgdzZXRMb2dvKhwIhgoQ/gcYECISc2V0TG9nb0Rlc2NyaXB0aW9uKh0IhwoQ/gcYwAQiEnNldExvZ29EZXNjcmlwdGlvbiopCIgKEP4HGBAiH3NldE5hdmlnYXRpb25Db250ZW50RGVzY3JpcHRpb24qKgiJChD+BxjABCIfc2V0TmF2aWdhdGlvbkNvbnRlbnREZXNjcmlwdGlvbiobCIoKEP4HGBAiEXNldE5hdmlnYXRpb25JY29uKhwIiwoQ/gcYvQQiEXNldE5hdmlnYXRpb25JY29uKicIjAoQ/gcY7AQiHHNldE5hdmlnYXRpb25PbkNsaWNrTGlzdGVuZXIqJQiNChD+BxjtBCIac2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIqGgiOChD+Bxi9BCIPc2V0T3ZlcmZsb3dJY29uKhcIjwoQ/gcYECINc2V0UG9wdXBUaGVtZSoVCJAKEP4HGBAiC3NldFN1YnRpdGxlKhYIkQoQ/gcYwAQiC3NldFN1YnRpdGxlKh4IkgoQ/gcYECIUc2V0U3VidGl0bGVUZXh0Q29sb3IqHwiTChD+BxjPBCIUc2V0U3VidGl0bGVUZXh0Q29sb3IqEgiUChD+BxgQIghzZXRUaXRsZSoTCJUKEP4HGMAEIghzZXRUaXRsZSoeCJYKEP4HGBAiFHNldFRpdGxlTWFyZ2luQm90dG9tKhsIlwoQ/gcYECIRc2V0VGl0bGVNYXJnaW5FbmQqHQiYChD+BxgQIhNzZXRUaXRsZU1hcmdpblN0YXJ0KhsImQoQ/gcYECIRc2V0VGl0bGVNYXJnaW5Ub3AqGwiaChD+BxgQIhFzZXRUaXRsZVRleHRDb2xvciocCJsKEP4HGM8EIhFzZXRUaXRsZVRleHRDb2xvcioXCJwKEIQIGFoiDWdldEluZmxhdGVkSWQqHAidChCECBjBBCIRZ2V0TGF5b3V0SW5mbGF0ZXIqGwieChCECBhaIhFnZXRMYXlvdXRSZXNvdXJjZSoXCJ8KEIQIGBAiDXNldEluZmxhdGVkSWQqHAigChCECBjuBCIRc2V0TGF5b3V0SW5mbGF0ZXIqGwihChCECBgQIhFzZXRMYXlvdXRSZXNvdXJjZSofCKIKEIQIGO8EIhRzZXRPbkluZmxhdGVMaXN0ZW5lcioXCKMKEIQIGBAiDXNldFZpc2liaWxpdHkqGAikChCGCBhRIg5zZXRSaXBwbGVTdGF0ZSoiCKUKEIYIGPAEIhdzZXRSaXBwbGVTdGF0ZSRsYW1iZGEkMiovCKYKEIcIGBkiJWdldENhblVzZUNvbXBvc2l0aW5nTGF5ZXIkdWlfZ3JhcGhpY3MqGginChCHCBjxBCIPZ2V0Q2FudmFzSG9sZGVyKhcIqAoQhwgYwgQiDGdldE93bmVyVmlldyovCKkKEIcIGFEiJXNldENhblVzZUNvbXBvc2l0aW5nTGF5ZXIkdWlfZ3JhcGhpY3MqGAiqChCHCBhRIg5zZXRJbnZhbGlkYXRlZCoXCKsKEIkIGFoiDWdldENoaWxkQ291bnQqKwisChCKCBhaIiFnZXRBdXRvQ2xlYXJGb2N1c0JlaGF2aW9yLTRVdFJQZDQqNwitChCKCBgEIi1nZXREaXNwb3NlVmlld0NvbXBvc2l0aW9uU3RyYXRlZ3kkYW5ub3RhdGlvbnMqGwiuChCKCBgZIhFnZXRIYXNDb21wb3NpdGlvbio2CK8KEIoIGBkiLGdldFNob3VsZENyZWF0ZUNvbXBvc2l0aW9uT25BdHRhY2hlZFRvV2luZG93Kh0IsAoQiggYGSITZ2V0U2hvd0xheW91dEJvdW5kcyopCLEKEIoIGAQiH2dldFNob3dMYXlvdXRCb3VuZHMkYW5ub3RhdGlvbnMqKwiyChCKCBgQIiFzZXRBdXRvQ2xlYXJGb2N1c0JlaGF2aW9yLTE3dGZKeE0qJgizChCKCBjyBCIbc2V0UGFyZW50Q29tcG9zaXRpb25Db250ZXh0KhsItAoQiggY8gQiEHNldFBhcmVudENvbnRleHQqKQi1ChCKCBjzBCIec2V0UHJldmlvdXNBdHRhY2hlZFdpbmRvd1Rva2VuKh0ItgoQiggYUSITc2V0U2hvd0xheW91dEJvdW5kcyocCLcKEIoIGFEiEnNldFRyYW5zaXRpb25Hcm91cColCLgKEIoIGPQEIhpzZXRWaWV3Q29tcG9zaXRpb25TdHJhdGVneSoiCLkKEIoEGPUEIhdnZXRBY2Nlc3NpYmlsaXR5TWFuYWdlcioiCLoKEIoEGPYEIhdnZXRBY2Nlc3NpYmlsaXR5TWFuYWdlciokCLsKEIoEGPcEIhlnZXRBbmRyb2lkVmlld3NIYW5kbGVyJHVpKhYIvAoQigQY+AQiC2dldEF1dG9maWxsKh0IvQoQigQY+QQiEmdldEF1dG9maWxsTWFuYWdlcioaCL4KEIoEGPoEIg9nZXRBdXRvZmlsbFRyZWUqFwi/ChCKBBj7BCIMZ2V0Q2xpcGJvYXJkKhcIwAoQigQY/AQiDGdldENsaXBib2FyZCoeCMEKEIoEGP0EIhNnZXRDbGlwYm9hcmRNYW5hZ2VyKh4IwgoQigQY/gQiE2dldENsaXBib2FyZE1hbmFnZXIqGwjDChCKBBj/BCIQZ2V0Q29uZmlndXJhdGlvbiomCMQKEIoEGIAFIhtnZXRDb250ZW50Q2FwdHVyZU1hbmFnZXIkdWkqHgjFChCKBBiBBSITZ2V0Q29yb3V0aW5lQ29udGV4dCoVCMYKEIoEGIIFIgpnZXREZW5zaXR5KiAIxwoQigQYgwUiFWdldERyYWdBbmREcm9wTWFuYWdlciogCMgKEIoEGIQFIhVnZXREcmFnQW5kRHJvcE1hbmFnZXIqIwjJChCKBBiFBSIYZ2V0RW1iZWRkZWRWaWV3Rm9jdXNSZWN0KhgIygoQigQYhgUiDWdldEZvY3VzT3duZXIqIAjLChCKBBiHBSIVZ2V0Rm9udEZhbWlseVJlc29sdmVyKhgIzAoQigQYiAUiDWdldEZvbnRMb2FkZXIqIwjNChCKBBgEIhlnZXRGb250TG9hZGVyJGFubm90YXRpb25zKiIIzgoQigQYiQUiF2dldEZyYW1lRW5kU2NoZWR1bGVyJHVpKh0IzwoQigQYigUiEmdldEdyYXBoaWNzQ29udGV4dCocCNAKEIoEGIsFIhFnZXRIYXB0aWNGZWVkQmFjayomCNEKEIoEGBkiHGdldEhhc1BlbmRpbmdNZWFzdXJlT3JMYXlvdXQqIQjSChCKBBhaIhdnZXRJbXBvcnRhbnRGb3JBdXRvZmlsbCoeCNMKEIoEGIwFIhNnZXRJbnB1dE1vZGVNYW5hZ2VyKhwI1AoQigQYjQUiEWdldEluc2V0c0xpc3RlbmVyKjQI1QoQigQYEyIqZ2V0TGFzdE1hdHJpeFJlY2FsY3VsYXRpb25BbmltYXRpb25UaW1lJHVpKkAI1goQigQYBCI2Z2V0TGFzdE1hdHJpeFJlY2FsY3VsYXRpb25BbmltYXRpb25UaW1lJHVpJGFubm90YXRpb25zKh0I1woQigQYjgUiEmdldExheW91dERpcmVjdGlvbioZCNgKEIoEGI8FIg5nZXRMYXlvdXROb2RlcyoZCNkKEIoEGJAFIg5nZXRMYXlvdXROb2RlcyodCNoKEIoEGBMiE2dldE1lYXN1cmVJdGVyYXRpb24qIgjbChCKBBiRBSIXZ2V0TW9kaWZpZXJMb2NhbE1hbmFnZXIqIAjcChCKBBiSBSIVZ2V0T3V0T2ZGcmFtZUV4ZWN1dG9yKiAI3QoQigQYkwUiFWdldE91dE9mRnJhbWVFeGVjdXRvciocCN4KEIoEGJQFIhFnZXRQbGFjZW1lbnRTY29wZSogCN8KEIoEGJUFIhVnZXRQb2ludGVySWNvblNlcnZpY2UqPQjgChCKBBiWBSIyZ2V0UHJpbWFyeURpcmVjdGlvbmFsTW90aW9uQXhpc092ZXJyaWRlLWRxTk5CYlUkdWkqSAjhChCKBBgEIj5nZXRQcmltYXJ5RGlyZWN0aW9uYWxNb3Rpb25BeGlzT3ZlcnJpZGUtZHFOTkJiVSR1aSRhbm5vdGF0aW9ucyoZCOIKEIoEGJcFIg5nZXRSZWN0TWFuYWdlciohCOMKEIoEGJgFIhZnZXRSZXRhaW5lZFZhbHVlc1N0b3JlKhII5AoQigQYmQUiB2dldFJvb3QqHQjlChCKBBgEIhNnZXRSb290JGFubm90YXRpb25zKhkI5goQigQYmgUiDmdldFJvb3RGb3JUZXN0KicI5woQigQYGSIdZ2V0U2Nyb2xsQ2FwdHVyZUluUHJvZ3Jlc3MkdWkqHAjoChCKBBibBSIRZ2V0U2VtYW50aWNzT3duZXIqHQjpChCKBBicBSISZ2V0U2hhcmVkRHJhd1Njb3BlKh0I6goQigQYGSITZ2V0U2hvd0xheW91dEJvdW5kcyopCOsKEIoEGAQiH2dldFNob3dMYXlvdXRCb3VuZHMkYW5ub3RhdGlvbnMqHgjsChCKBBidBSITZ2V0U25hcHNob3RPYnNlcnZlciooCO0KEIoEGJ4FIh1nZXRTb2Z0d2FyZUtleWJvYXJkQ29udHJvbGxlcioeCO4KEIoEGJ8FIhNnZXRUZXh0SW5wdXRTZXJ2aWNlKikI7woQigQYBCIfZ2V0VGV4dElucHV0U2VydmljZSRhbm5vdGF0aW9ucyoZCPAKEIoEGKAFIg5nZXRUZXh0VG9vbGJhciopCPEKEIoEGKEFIh5nZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIkdWkqEgjyChCKBBjCBCIHZ2V0VmlldyofCPMKEIoEGKIFIhRnZXRWaWV3Q29uZmlndXJhdGlvbiocCPQKEIoEGKMFIhFnZXRWaWV3VHJlZU93bmVycyoYCPUKEIoEGKQFIg1nZXRXaW5kb3dJbmZvKiEI9goQigQYpQUiFmdldF9hdXRvZmlsbE1hbmFnZXIkdWkqHQj3ChCKBBijBSISZ2V0X3ZpZXdUcmVlT3duZXJzKjII+AoQigQYQCIoc2V0QWNjZXNzaWJpbGl0eUV2ZW50QmF0Y2hJbnRlcnZhbE1pbGxpcyobCPkKEIoEGKYFIhBzZXRDb25maWd1cmF0aW9uKiYI+goQigQYpwUiG3NldENvbnRlbnRDYXB0dXJlTWFuYWdlciR1aSoeCPsKEIoEGKgFIhNzZXRDb3JvdXRpbmVDb250ZXh0KhUI/AoQigQYqQUiCnNldERlbnNpdHkqIAj9ChCKBBiqBSIVc2V0Rm9udEZhbWlseVJlc29sdmVyKiII/goQigQYqwUiF3NldEZyYW1lRW5kU2NoZWR1bGVyJHVpKjQI/woQigQYQCIqc2V0TGFzdE1hdHJpeFJlY2FsY3VsYXRpb25BbmltYXRpb25UaW1lJHVpKh0IgAsQigQYrAUiEnNldExheW91dERpcmVjdGlvbionCIELEIoEGK0FIhxzZXRPblZpZXdUcmVlT3duZXJzQXZhaWxhYmxlKj0IggsQigQYrgUiMnNldFByaW1hcnlEaXJlY3Rpb25hbE1vdGlvbkF4aXNPdmVycmlkZS1yMmVwTHQ4JHVpKh0IgwsQigQYUSITc2V0U2hvd0xheW91dEJvdW5kcyomCIQLEIoEGK8FIhtzZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIqKQiFCxCKBBivBSIec2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyJHVpKh0IhgsQigQYsAUiEnNldF92aWV3VHJlZU93bmVycyogCIcLEI8IGLEFIhVnZXRIb2xkZXJUb0xheW91dE5vZGUqIAiICxCPCBixBSIVZ2V0TGF5b3V0Tm9kZVRvSG9sZGVyKiQIiQsQvggYuwQiGWdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWUqNgiKCxC+CBgZIixnZXRTaG91bGRDcmVhdGVDb21wb3NpdGlvbk9uQXR0YWNoZWRUb1dpbmRvdypCCIsLEL4IGAQiOGdldFNob3VsZENyZWF0ZUNvbXBvc2l0aW9uT25BdHRhY2hlZFRvV2luZG93JGFubm90YXRpb25zKhUIjAsQvggYsgUiCnNldENvbnRlbnQqIQiNCxDACBgZIhdnZXRDYW5DYWxjdWxhdGVQb3NpdGlvbioVCI4LEMAIGLMFIgpnZXRDb250ZW50KhcIjwsQwAgYtAUiDGdldFBhcmFtcyR1aSoiCJALEMAIGAQiGGdldFBhcmFtcyR1aSRhbm5vdGF0aW9ucyolCJELEMAIGLUFIhpnZXRQYXJlbnRMYXlvdXRDb29yZGluYXRlcyojCJILEMAIGI4FIhhnZXRQYXJlbnRMYXlvdXREaXJlY3Rpb24qJgiTCxDACBi2BSIbZ2V0UG9wdXBDb250ZW50U2l6ZS1iT002dFh3Kh4IlAsQwAgYtwUiE2dldFBvc2l0aW9uUHJvdmlkZXIqNgiVCxDACBgZIixnZXRTaG91bGRDcmVhdGVDb21wb3NpdGlvbk9uQXR0YWNoZWRUb1dpbmRvdyogCJYLEMAIGLgFIhVnZXRTdWJDb21wb3NpdGlvblZpZXcqFAiXCxDACBhrIgpnZXRUZXN0VGFnKhYImAsQwAgYwgQiC2dldFZpZXdSb290KiIImQsQwAgYuQUiF2dldFZpc2libGVEaXNwbGF5Qm91bmRzKhUImgsQwAgYsgUiCnNldENvbnRlbnQqHAibCxDACBgQIhJzZXRMYXlvdXREaXJlY3Rpb24qJQicCxDACBi6BSIac2V0UGFyZW50TGF5b3V0Q29vcmRpbmF0ZXMqIwidCxDACBisBSIYc2V0UGFyZW50TGF5b3V0RGlyZWN0aW9uKiYIngsQwAgYuwUiG3NldFBvcHVwQ29udGVudFNpemUtZmh4anJQQSoeCJ8LEMAIGLwFIhNzZXRQb3NpdGlvblByb3ZpZGVyKhQIoAsQwAgYbSIKc2V0VGVzdFRhZyosCKELEMYIGL0FIiFnZXRPckluc3RhbGxTeXN0ZW1CYXJTdGF0ZU1vbml0b3IqGQiiCxDGCBi+BSIOc2V0UHJvdGVjdGlvbnMqJgijCxDICBjGASIbZ2V0Qm90dG9tRmFkaW5nRWRnZVN0cmVuZ3RoKhwIpAsQyAgYWiISZ2V0TWF4U2Nyb2xsQW1vdW50Kh0IpQsQyAgYWiITZ2V0TmVzdGVkU2Nyb2xsQXhlcyokCKYLEMgIGL8FIhlnZXRTY3JvbGxGZWVkYmFja1Byb3ZpZGVyKhgIpwsQyAgYWiIOZ2V0U2Nyb2xsUmFuZ2UqIwioCxDICBjGASIYZ2V0VG9wRmFkaW5nRWRnZVN0cmVuZ3RoKigIqQsQyAgYxgEiHWdldFZlcnRpY2FsU2Nyb2xsRmFjdG9yQ29tcGF0KhkIqgsQyAgYUSIPc2V0RmlsbFZpZXdwb3J0KiMIqwsQyAgYUSIZc2V0TmVzdGVkU2Nyb2xsaW5nRW5hYmxlZCokCKwLEMgIGMAFIhlzZXRPblNjcm9sbENoYW5nZUxpc3RlbmVyKiMIrQsQyAgYUSIZc2V0U21vb3RoU2Nyb2xsaW5nRW5hYmxlZCoWCK4LEMsIGMEFIgtnZXRGcmFnbWVudComCK8LEMsIGFEiHHNldERyYXdEaXNhcHBlYXJpbmdWaWV3c0xhc3QqHgiwCxDLCBjCBSITc2V0TGF5b3V0VHJhbnNpdGlvbiopCLELEMsIGMMFIh5zZXRPbkFwcGx5V2luZG93SW5zZXRzTGlzdGVuZXIqEQiyCxDPCBjEBSIGPGluaXQ+KhEIswsQ0AgYxAUiBjxpbml0PioRCLQLENEIGMQFIgY8aW5pdD4qEQi1CxDSCBjEBSIGPGluaXQ+KhEItgsQ0wgYxAUiBjxpbml0PioRCLcLENQIGMUFIgY8aW5pdD4qEAi4CxDkCBgEIgY8aW5pdD4qEAi5CxDlCBgEIgY8aW5pdD4qEAi6CxDmCBgEIgY8aW5pdD4qEAi7CxDnCBgEIgY8aW5pdD4qEAi8CxDoCBgEIgY8aW5pdD4qEAi9CxDpCBjGBSIFc2V0VXAqEAi+CxDsCBjGBSIFc2V0VXAqKgi/CxDtCBjHBSIfYWRqdXN0TGF5b3V0SW5EaXNwbGF5Q3V0b3V0TW9kZSoQCMALEO4IGMYFIgVzZXRVcCoqCMELEO8IGMcFIh9hZGp1c3RMYXlvdXRJbkRpc3BsYXlDdXRvdXRNb2RlKhAIwgsQ8AgYxgUiBXNldFVwKiQIwwsQ8QgYyAUiGWxvY2FsZUxpc3RGb3JMYW5ndWFnZVRhZ3MqLQjECxDzCBjJBSIibG9jYWxlTWFuYWdlckdldEFwcGxpY2F0aW9uTG9jYWxlcyotCMULEPMIGMoFIiJsb2NhbGVNYW5hZ2VyU2V0QXBwbGljYXRpb25Mb2NhbGVzKhoIxgsQ9AgYywUiD2lzUG93ZXJTYXZlTW9kZSoYCMcLEPQIGMwFIg10b0xhbmd1YWdlVGFnKiUIyAsQ9wgYzQUiGmdlbmVyYXRlQ29uZmlnRGVsdGFfbG9jYWxlKhUIyQsQ9wgYzgUiCmdldExvY2FsZXMqHAjKCxD3CBjPBSIRc2V0RGVmYXVsdExvY2FsZXMqFQjLCxD3CBjQBSIKc2V0TG9jYWxlcyolCMwLEPkIGNEFIhpnZXRPbkJhY2tJbnZva2VkRGlzcGF0Y2hlciooCM0LEPkIGNIFIh1yZWdpc3Rlck9uQmFja1ByZXNzZWRDYWxsYmFjayoqCM4LEPkIGNMFIh91bnJlZ2lzdGVyT25CYWNrSW52b2tlZENhbGxiYWNrKiIIzwsQ/QgYWiIYZ2V0RGlzYWJsZWRDb21wb25lbnRGbGFnKh0I0AsQ/ggY1AUiEmNyZWF0ZUZyb21YbWxJbm5lciokCNELEP4IGNUFIhlnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKhII0gsQ/ggY1gUiB2luZmxhdGUqHAjTCxCCCRjXBSIRb25TZWFyY2hSZXF1ZXN0ZWQqJQjUCxCCCRjYBSIab25XaW5kb3dTdGFydGluZ0FjdGlvbk1vZGUqJQjVCxCFCRjZBSIab25Qcm92aWRlS2V5Ym9hcmRTaG9ydGN1dHMqIgjWCxCGCRjaBSIXb25Qb2ludGVyQ2FwdHVyZUNoYW5nZWQqHAjXCxCHCRjbBSIRb25Ecm9wRm9yVGV4dFZpZXcqGAjYCxCHCRjcBSINb25Ecm9wRm9yVmlldyofCNkLEIkJGN0FIhRzZXREcm9wRG93blZpZXdUaGVtZSocCNoLEIsJGN4FIhFnZXRUZXh0Q2xhc3NpZmllcioZCNsLEIwJGN8FIg5mb3JMYW5ndWFnZVRhZyoaCNwLEI0JGMgFIg9mb3JMYW5ndWFnZVRhZ3MqGQjdCxCNCRjgBSIOc2V0VGV4dExvY2FsZXMqJQjeCxCOCRjhBSIaZ2V0QXV0b1NpemVTdGVwR3JhbnVsYXJpdHkqNgjfCxCOCRjiBSIrc2V0QXV0b1NpemVUZXh0VHlwZVVuaWZvcm1XaXRoQ29uZmlndXJhdGlvbio0COALEI4JGOMFIilzZXRBdXRvU2l6ZVRleHRUeXBlVW5pZm9ybVdpdGhQcmVzZXRTaXplcyojCOELEI4JGOQFIhhzZXRGb250VmFyaWF0aW9uU2V0dGluZ3MqEQjiCxCPCRjlBSIGY3JlYXRlKikI4wsQkQkY5gUiHmNyZWF0ZVN0YXRpY0xheW91dEZvck1lYXN1cmluZyohCOQLEJUJGOcFIhZkcmF3YWJsZUhvdHNwb3RDaGFuZ2VkKiUI5QsQlgkY6AUiGmlzU2VsZWN0ZWRDaGlsZFZpZXdFbmFibGVkKiYI5gsQlgkY6QUiG3NldFNlbGVjdGVkQ2hpbGRWaWV3RW5hYmxlZCogCOcLEJgJGOoFIhVnZXRNYXhBdmFpbGFibGVIZWlnaHQqHQjoCxCaCRjrBSISc2V0RXBpY2VudGVyQm91bmRzKh8I6QsQmgkY7AUiFHNldElzQ2xpcHBlZFRvU2NyZWVuKh0I6gsQmwkY7QUiEnNldEVudGVyVHJhbnNpdGlvbiocCOsLEJsJGO0FIhFzZXRFeGl0VHJhbnNpdGlvbioYCOwLEJ0JGOwFIg1zZXRUb3VjaE1vZGFsKiUI7QsQngkY7gUiGnJlZnJlc2hBdXRvQ29tcGxldGVSZXN1bHRzKh0I7gsQngkY7wUiEnNldElucHV0TWV0aG9kTW9kZSomCO8LEKAJGPAFIhtmaW5kT25CYWNrSW52b2tlZERpc3BhdGNoZXIqIwjwCxCgCRjxBSIYbmV3T25CYWNrSW52b2tlZENhbGxiYWNrKisI8QsQoAkY0wUiIHRyeVJlZ2lzdGVyT25CYWNrSW52b2tlZENhbGxiYWNrKi0I8gsQoAkY0wUiInRyeVVucmVnaXN0ZXJPbkJhY2tJbnZva2VkQ2FsbGJhY2sqGQjzCxCiCRijASIOc2V0VG9vbHRpcFRleHQqIgj0CxCjCRjyBSIXY29tcHV0ZUZpdFN5c3RlbVdpbmRvd3MqIwj1CxCkCRjzBSIYbWFrZUJhc2ljQWN0aXZpdHlPcHRpb25zKhoI9gsQpgkYayIQZ2V0RGVmYXVsdExvY2FsZSoiCPcLEKcJGPQFIhdzZXRTaGFyZUlkZW50aXR5RW5hYmxlZCoXCPgLEKgJGPUFIgxzZXRDbGFzc05hbWUqGwj5CxCqCRhYIhFkaXNhbGxvd0ZvcmNlRGFyayobCPoLEKsJGPYFIhBzdGFydERyYWdBbmREcm9wKiYI+wsQrgkYWCIcY2xlYXJWaWV3VHJhbnNsYXRpb25DYWxsYmFjayokCPwLEK4JGFgiGnNldFZpZXdUcmFuc2xhdGlvbkNhbGxiYWNrKhkI/QsQrwkY9wUiDnNldFBvaW50ZXJJY29uKhQI/gsQsQkY+AUiCWZvY3VzYWJsZSogCP8LELIJGKEBIhVpc1Nob3dpbmdMYXlvdXRCb3VuZHMqIAiADBCzCRicASIVc2V0UmVxdWVzdGVkRnJhbWVSYXRlKioIgQwQtAkY+QUiH2NhbGN1bGF0ZU1hdHJpeFRvV2luZG93LUVMOEJUaTgqHQiCDBC1CRj6BSISaXNWYWxpZE1vdGlvbkV2ZW50Kh4IgwwQtwkYFyIUZm9udFdlaWdodEFkanVzdG1lbnQqNQiEDBC4CRj7BSIqZ2V0TWF4RGlhbG9nSGVpZ2h0RXhjbHVkaW5nU3lzdGVtQmFySW5zZXRzKiMIhQwQuQkY/AUiGHNldExheW91dEluRGlzcGxheUN1dG91dCo1CIYMELoJGPsFIipnZXRNYXhEaWFsb2dIZWlnaHRFeGNsdWRpbmdTeXN0ZW1CYXJJbnNldHMqHAiHDBC6CRj9BSIRc2V0Rml0SW5zZXRzU2lkZXMqHAiIDBC6CRj9BSIRc2V0Rml0SW5zZXRzVHlwZXMqFgiJDBC7CRj+BSILY3JlYXRlQXN5bmMqGAiKDBC+CRj/BSINZ2V0RXhjbHVzaW9ucyoQCIsMEL8JGIAGIgVjbG9zZSoOCIwMEL8JGIEGIgNkdXAqEAiNDBC/CRiCBiIFbHNlZWsqGAiODBDBCRiDBiINc2V0RGF0YVNvdXJjZSoeCI8MEMQJGFoiFGdldEFkU2VydmljZXNWZXJzaW9uKiMIkAwQxQkYhAYiGGRlbGV0ZVJlZ2lzdHJhdGlvbnNBc3luYyonCJEMEMUJGIUGIhxnZXRNZWFzdXJlbWVudEFwaVN0YXR1c0FzeW5jKh4IkgwQxQkYhgYiE3JlZ2lzdGVyU291cmNlQXN5bmMqHwiTDBDFCRiHBiIUcmVnaXN0ZXJUcmlnZ2VyQXN5bmMqIQiUDBDFCRiIBiIWcmVnaXN0ZXJXZWJTb3VyY2VBc3luYyoiCJUMEMUJGIkGIhdyZWdpc3RlcldlYlRyaWdnZXJBc3luYyoeCJYMEMsJGIoGIhNkZWxldGVSZWdpc3RyYXRpb25zKiIIlwwQywkYiwYiF2dldE1lYXN1cmVtZW50QXBpU3RhdHVzKhkImAwQywkYjAYiDnJlZ2lzdGVyU291cmNlKhoImQwQywkYjQYiD3JlZ2lzdGVyVHJpZ2dlciocCJoMEMsJGI4GIhFyZWdpc3RlcldlYlNvdXJjZSodCJsMEMsJGI8GIhJyZWdpc3RlcldlYlRyaWdnZXIqEwicDBDMCRgZIglpc0VuYWJsZWQqJwidDBDNCRhtIh10aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiokCJ4MEM0JGG0iGnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKicInwwQzgkYbSIddGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24qJAigDBDOCRhtIhp0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiooCKEMEM4JGG0iHnRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbionCKIMEM8JGG0iHXRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKiQIowwQzwkYbSIadGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24qJwikDBDQCRhtIh10aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiokCKUMENAJGG0iGnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKi4IpgwQ0QkYBCIkdGhyb3dDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKi0IpwwQ0gkYkAYiInRocm93TGlzdEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24qJQioDBDSCRgQIht0aHJvd05lZ2F0aXZlSW5kZXhFeGNlcHRpb24qIwipDBDSCRiQBiIYdGhyb3dPdXRPZlJhbmdlRXhjZXB0aW9uKigIqgwQ0gkYkAYiHXRocm93UmV2ZXJzZWRJbmRpY2VzRXhjZXB0aW9uKiQIqwwQ0wkYbSIadGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24qJAisDBDUCRhtIhp0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbionCK0MENUJGG0iHXRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKicIrgwQ1gkYbSIddGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24qJAivDBDWCRhtIhp0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiooCLAMENYJGG0iHnRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbionCLEMENcJGG0iHXRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKiQIsgwQ1wkYbSIadGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24qKgizDBDYCRiQBiIfdGhyb3dJbnZhbGlkQ29uc3RyYWludEV4Y2VwdGlvbiovCLQMENgJGJEGIiR0aHJvd0ludmFsaWRDb25zdHJhaW50c1NpemVFeGNlcHRpb24qJwi1DBDaCRhtIh10aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiokCLYMENoJGG0iGnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKiYItwwQ2wkYkgYiG3Rocm93Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbiosCLgMENsJGG0iInRocm93VW5zdXBw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AhAJGM0FMgYI3gIYzgUyCAjfAhAJGM8FMgYI4AIY0AUyCAjhAhAJGNEFMgYI4gIY0gUyCAjjAhAJGNMFMgYI5AIY1AUyCAjlAhAJGNUFMgYI5gIY1gUyCAjnAhAJGNcFMgYI6AIY2AUyCAjpAhAJGNkFMgYI6gIY2gUyCAjrAhAJGNsFMgYI7AIY3AUyCAjtAhAJGN0FMgYI7gIY3gUyCAjvAhAJGN8FMgYI8AIY4AUyCAjxAhAJGOEFMgYI8gIY4gUyCAjzAhAJGOMFMgYI9AIY5AUyCAj1AhAJGOUFMgYI9gIY5gUyCAj3AhAJGOcFMgYI+AIY6AUyCAj5AhAJGOkFMgYI+gIY6gUyCAj7AhAJGOsFMgYI/AIY7AUyCAj9AhAJGO0FMgYI/gIY7gUyCAj/AhAJGO8FMgYIgAMY8AUyCAiBAxAJGPEFMgYIggMY8gUyCAiDAxAJGPMFMgYIhAMY9AUyCAiFAxAJGPUFMgYIhgMY9gUyCAiHAxAJGPcFMgYIiAMY+AUyCAiJAxAJGPkFMgYIigMY+gUyCAiLAxAJGPsFMgYIjAMY/AUyCAiNAxAJGP0FMgYIjgMY/gUyCAiPAxAJGP8FMgYIkAMYgAYyCAiRAxAJGIEGMgYIkgMYggYyCAiTAxAJGIMGMgYIlAMYhAYyCAiVAxAJGIUGMgYIlgMYhgYyCAiXAxAJGIcGMgYImAMYiAYyCAiZAxAJGIkGMgYImgMYigYyCAibAxAJGIsGMgYInAMYjAYyCAidAxAJGI0GMgYIngMYjgYyCAifAxAJGI8GMgYIoAMYkAYyCAihAxAJGJEGMgYIogMYkgYyBgijAxiUBjIGCKQDGJYGMgYIpQMYmAYyBgimAxiaBjIGCKcDGJwGMgYIqAMYngYyBgipAxigBjIGCKoDGKIGMgYIqwMYpAYyBgisAximBjIGCK0DGKgGMgYIrgMYqgYyBgivAxisBjIGCLADGK4GMgYIsQMYsAYyBgiyAxiyBjIGCLMDGLQGMgYItAMYtgYyBgi1Axi4BjIGCLYDGLoGMgYItwMYvAYyBgi4Axi+BjIGCLkDGMAGMgYIugMYwgYyCAi7AxAJGMMGMgYIvAMYxAYyCAi9AxAJGMUGMgYIvgMYxgYyCAi/AxAJGMcGMgYIwAMYyAYyCAjBAxAJGMkGMgYIwgMYygYyCAjDAxAJGMsG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ENoBGCwyCAjvBRDbARgsMggI8AUQNxj6CDIJCPEFENwBGPwIMggI8gUQ3QEYLDIGCPMFGKUJMggI9AUQ3gEYLDIICPUFEN8BGCwyCAj2BRDgARhPMggI9wUQ4QEYLDIICPgFEOIBGCwyCAj5BRDjARgsMggI+gUQ5AEYTzIICPsFELoBGFEyCAj8BRDlARgsMggI/QUQ5gEYLDIJCP4FEOcBGL0JMgUI/wUYWDIICIAGEOgBGCwyCQiBBhDoARjACTIICIIGEOkBGFAyCAiDBhDqARgsMgkIhAYQ6wEYxwkyBgiFBhjHCTIJCIYGEOwBGMcJMgkIhwYQkwEYxwkyCQiIBhDtARjHCTIJCIkGEO4BGMcJMggIigYQ7wEYbzIICIsGEPABGG8yCAiMBhDxARhvMggIjQYQ8gEYbzIICI4GEPMBGG8yCAiPBhD0ARhvMgcIkAYQdRgsMggIkQYQBxjZCTIICJIGEAkY2QkyCAiTBhD1ARhIMggIlAYQ9gEYbzIICJUGEPcBGG8yCAiWBhD4ARhvOi0SK0xhbmRyb2lkeC9uYXZpZ2F0aW9uMy9ydW50aW1lL05hdkJhY2tTdGFjazs6XggBElpMYW5kcm9pZHgvc2F2ZWRzdGF0ZS9zZXJpYWxpemF0aW9uL3NlcmlhbGl6ZXJzL1NwYXJzZUFycmF5U2VyaWFsaXplciRTcGFyc2VBcnJheVN1cnJvZ2F0ZTs6TwgCEktMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbmV0d29yay9tb2RlbC9OZXR3b3JrQ2hhbmdlTGlzdDs6UQgDEk1MY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbmV0d29yay9tb2RlbC9OZXR3b3JrTmV3c1Jlc291cmNlOzpKCAQSRkxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL21vZGVsL05ldHdvcmtUb3BpYzs6UAgFEkxMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbmV0d29yay9yZXRyb2ZpdC9OZXR3b3JrUmVzcG9uc2U7OlsIBhJXTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL2Jvb2ttYXJrcy9hcGkvbmF2aWdhdGlvbi9Cb29rbWFya3NOYXZLZXk7OlUIBxJRTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL2ZvcnlvdS9hcGkvbmF2aWdhdGlvbi9Gb3JZb3VOYXZLZXk7OlsICBJXTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL2ludGVyZXN0cy9hcGkvbmF2aWdhdGlvbi9JbnRlcmVzdHNOYXZLZXk7OlUICRJRTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL3NlYXJjaC9hcGkvbmF2aWdhdGlvbi9TZWFyY2hOYXZLZXk7OlMIChJPTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL3RvcGljL2FwaS9uYXZpZ2F0aW9uL1RvcGljTmF2S2V5OzoqCAsSJkxrb3RsaW54L2RhdGV0aW1lL0ZpeGVkT2Zmc2V0VGltZVpvbmU7Oh4IDBIaTGtvdGxpbngvZGF0ZXRpbWUvSW5zdGFudDs6IAgNEhxMa290bGlueC9kYXRldGltZS9Mb2NhbERhdGU7OiAIDhIcTGtvdGxpbngvZGF0ZXRpbWUvTG9jYWxUaW1lOzofCA8SG0xrb3RsaW54L2RhdGV0aW1lL1RpbWVab25lOzogCBASHExrb3RsaW54L2RhdGV0aW1lL1V0Y09mZnNldDs6KggREiZMa290bGlueC9zZXJpYWxpemF0aW9uL2pzb24vSnNvbkFycmF5OzosCBISKExrb3RsaW54L3NlcmlhbGl6YXRpb24vanNvbi9Kc29uRWxlbWVudDs6KQgTEiVMa290bGlueC9zZXJpYWxpemF0aW9uL2pzb24vSnNvbk51bGw7OisIFBInTGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL0pzb25PYmplY3Q7Oi4IFRIqTGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL0pzb25QcmltaXRpdmU7OjkIFhI1TGFuZHJvaWR4L25hdmlnYXRpb24zL3J1bnRpbWUvTmF2QmFja1N0YWNrJENvbXBhbmlvbjs6aAgXEmRMYW5kcm9pZHgvc2F2ZWRzdGF0ZS9zZXJpYWxpemF0aW9uL3NlcmlhbGl6ZXJzL1NwYXJzZUFycmF5U2VyaWFsaXplciRTcGFyc2VBcnJheVN1cnJvZ2F0ZSRDb21wYW5pb247OlkIGBJVTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL25ldHdvcmsvbW9kZWwvTmV0d29ya0NoYW5nZUxpc3QkQ29tcGFuaW9uOzpbCBkSV0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL21vZGVsL05ldHdvcmtOZXdzUmVzb3VyY2UkQ29tcGFuaW9uOzpUCBoSUExjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL21vZGVsL05ldHdvcmtUb3BpYyRDb21wYW5pb247OloIGxJWTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL25ldHdvcmsvcmV0cm9maXQvTmV0d29ya1Jlc3BvbnNlJENvbXBhbmlvbjs6ZQgcEmFMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvaW50ZXJlc3RzL2FwaS9uYXZpZ2F0aW9uL0ludGVyZXN0c05hdktleSRDb21wYW5pb247Ol0IHRJZTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL3RvcGljL2FwaS9uYXZpZ2F0aW9uL1RvcGljTmF2S2V5JENvbXBhbmlvbjs6NAgeEjBMa290bGlueC9kYXRldGltZS9GaXhlZE9mZnNldFRpbWVab25lJENvbXBhbmlvbjs6KAgfEiRMa290bGlueC9kYXRldGltZS9JbnN0YW50JENvbXBhbmlvbjs6KgggEiZMa290bGlueC9kYXRldGltZS9Mb2NhbERhdGUkQ29tcGFuaW9uOzoqCCESJkxrb3RsaW54L2RhdGV0aW1lL0xvY2FsVGltZSRDb21wYW5pb247OikIIhIlTGtvdGxpbngvZGF0ZXRpbWUvVGltZVpvbmUkQ29tcGFuaW9uOzoqCCMSJkxrb3RsaW54L2RhdGV0aW1lL1V0Y09mZnNldCRDb21wYW5pb247OjQIJBIwTGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL0pzb25BcnJheSRDb21wYW5pb247OjYIJRIyTGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL0pzb25FbGVtZW50JENvbXBhbmlvbjs6NQgmEjFMa290bGlueC9zZXJpYWxpemF0aW9uL2pzb24vSnNvbk9iamVjdCRDb21wYW5pb247OjgIJxI0TGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL0pzb25QcmltaXRpdmUkQ29tcGFuaW9uOzonCCgSI0xrb3RsaW54L3NlcmlhbGl6YXRpb24vS1NlcmlhbGl6ZXI7OksIKRJHTGFuZHJvaWR4L3dpbmRvdy9sYXlvdXQvYWRhcHRlci9zaWRlY2FyL0Rpc3RpbmN0RWxlbWVudFNpZGVjYXJDYWxsYmFjazs6TggqEkpMYW5kcm9pZHgvd2luZG93L2xheW91dC9hZGFwdGVyL3NpZGVjYXIvU2lkZWNhckNvbXBhdCRUcmFuc2xhdGluZ0NhbGxiYWNrOzowCCsSLExhbmRyb2lkeC93aW5kb3cvc2lkZWNhci9TaWRlY2FyRGV2aWNlU3RhdGU7OgUILBIBVjoYCC0SFExhbmRyb2lkL29zL0lCaW5kZXI7OjUILhIxTGFuZHJvaWR4L3dpbmRvdy9zaWRlY2FyL1NpZGVjYXJXaW5kb3dMYXlvdXRJbmZvOzpWCC8SUkxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL3JldHJvZml0L1JldHJvZml0TmlhTmV0d29ya0FwaTs6KggwEiZMYW5kcm9pZHgvZnJhZ21lbnQvYXBwL0RpYWxvZ0ZyYWdtZW50Ozo+CDESOkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9TdXBwb3J0RXJyb3JEaWFsb2dGcmFnbWVudDs6NAgyEjBMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9jb21tb24vYXBpL2ludGVybmFsL3p6ZDs6PAgzEjhMY29tL2dvb2dsZS9hbmRyb2lkL2RhdGF0cmFuc3BvcnQvY2N0L0NjdEJhY2tlbmRGYWN0b3J5Ozo0CDQSMExjb20vZ29vZ2xlL2ZpcmViYXNlL0ZpcmViYXNlQ29tbW9uS3R4UmVnaXN0cmFyOzo0CDUSMExjb20vZ29vZ2xlL2ZpcmViYXNlL2FidC9jb21wb25lbnQvQWJ0UmVnaXN0cmFyOzpSCDYSTkxjb20vZ29vZ2xlL2ZpcmViYXNlL2FuYWx5dGljcy9jb25uZWN0b3IvaW50ZXJuYWwvQW5hbHl0aWNzQ29ubmVjdG9yUmVnaXN0cmFyOzpFCDcSQUxjb20vZ29vZ2xlL2ZpcmViYXNlL2NyYXNobHl0aWNzL0ZpcmViYXNlQ3Jhc2hseXRpY3NLdHhSZWdpc3RyYXI7OkkIOBJFTGNvbS9nb29nbGUvZmlyZWJhc2UvY3Jhc2hseXRpY3Mva3R4L0ZpcmViYXNlQ3Jhc2hseXRpY3NLdHhSZWdpc3RyYXI7OjoIORI2TGNvbS9nb29nbGUvZmlyZWJhc2UvZGF0YXRyYW5zcG9ydC9UcmFuc3BvcnRSZWdpc3RyYXI7OkYIOhJCTGNvbS9nb29nbGUvZmlyZWJhc2UvaW5zdGFsbGF0aW9ucy9GaXJlYmFzZUluc3RhbGxhdGlvbnNSZWdpc3RyYXI7OjgIOxI0TGNvbS9nb29nbGUvZmlyZWJhc2Uva3R4L0ZpcmViYXNlQ29tbW9uS3R4UmVnaXN0cmFyOzo7CDwSN0xjb20vZ29vZ2xlL2ZpcmViYXNlL2t0eC9GaXJlYmFzZUNvbW1vbkxlZ2FjeVJlZ2lzdHJhcjs6Pgg9EjpMY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvRmlyZWJhc2VNZXNzYWdpbmdSZWdpc3RyYXI7OjcIPhIzTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9GaXJlYmFzZVBlcmZLdHhSZWdpc3RyYXI7OjQIPxIwTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9GaXJlYmFzZVBlcmZSZWdpc3RyYXI7OjkIQBI1TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9jb25maWcvUmVtb3RlQ29uZmlnTWFuYWdlcjs6OwhBEjdMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL2t0eC9GaXJlYmFzZVBlcmZLdHhSZWdpc3RyYXI7OjUIQhIxTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9zZXNzaW9uL1Nlc3Npb25NYW5hZ2VyOzo6CEMSNkxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvc2Vzc2lvbi9nYXVnZXMvR2F1Z2VNYW5hZ2VyOzpHCEQSQ0xjb20vZ29vZ2xlL2ZpcmViYXNlL3JlbW90ZWNvbmZpZy9GaXJlYmFzZVJlbW90ZUNvbmZpZ0t0eFJlZ2lzdHJhcjs6PAhFEjhMY29tL2dvb2dsZS9maXJlYmFzZS9yZW1vdGVjb25maWcvUmVtb3RlQ29uZmlnUmVnaXN0cmFyOzpLCEYSR0xjb20vZ29vZ2xlL2ZpcmViYXNlL3JlbW90ZWNvbmZpZy9rdHgvRmlyZWJhc2VSZW1vdGVDb25maWdLdHhSZWdpc3RyYXI7OjwIRxI4TGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvRmlyZWJhc2VTZXNzaW9uc1JlZ2lzdHJhcjs6FghIEhJMamF2YS9sYW5nL1N0cmluZzs6TwhJEktMY29tL2dvb2dsZS9maXJlYmFzZS9jcmFzaGx5dGljcy9GaXJlYmFzZUNyYXNobHl0aWNzS3R4UmVnaXN0cmFyJENvbXBhbmlvbjs6UwhKEk9MY29tL2dvb2dsZS9maXJlYmFzZS9jcmFzaGx5dGljcy9rdHgvRmlyZWJhc2VDcmFzaGx5dGljc0t0eFJlZ2lzdHJhciRDb21wYW5pb247OkAISxI8TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9hcHBsaWNhdGlvbi9BcHBTdGF0ZVVwZGF0ZUhhbmRsZXI7OiEITBIdTGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTs6OghNEjZMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL2FwcGxpY2F0aW9uL0FwcFN0YXRlTW9uaXRvcjs6OQhOEjVMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0FwcGxpY2F0aW9uUHJvY2Vzc1N0YXRlOzoFCE8SAVo6BQhQEgFKOgUIURIBSTosCFISKExqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcDs6OAhTEjRMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL2NvbmZpZy9EZXZpY2VDYWNoZU1hbmFnZXI7OiMIVBIfTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yOzo7CFUSN0xjb20vZ29vZ2xlL2ZpcmViYXNlL3JlbW90ZWNvbmZpZy9GaXJlYmFzZVJlbW90ZUNvbmZpZzs6KQhWEiVMY29tL2dvb2dsZS9maXJlYmFzZS9pbmplY3QvUHJvdmlkZXI7OjQIVxIwTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9sb2dnaW5nL0FuZHJvaWRMb2dnZXI7OhMIWBIPTGphdmEvdXRpbC9TZXQ7OjIIWRIuTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9zZXNzaW9uL1BlcmZTZXNzaW9uOzohCFoSHUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU7OjQIWxIwTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9jb25maWcvQ29uZmlnUmVzb2x2ZXI7OikIXBIlTGNvbS9nb29nbGUvZmlyZWJhc2UvY29tcG9uZW50cy9MYXp5OzoqCF0SJkxqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRGdXR1cmU7OkIIXhI+TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9zZXNzaW9uL2dhdWdlcy9HYXVnZU1ldGFkYXRhTWFuYWdlcjs6OQhfEjVMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3RyYW5zcG9ydC9UcmFuc3BvcnRNYW5hZ2VyOzpGCGASQkxjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL0ZpcmViYXNlU2Vzc2lvbnNSZWdpc3RyYXIkQ29tcGFuaW9uOzouCGESKkxjb20vZ29vZ2xlL2ZpcmViYXNlL2NvbXBvbmVudHMvUXVhbGlmaWVkOzpHCGISQ0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9ydW50aW1lL2JhY2tlbmRzL0NyZWF0aW9uQ29udGV4dDs6SAhjEkRMY29tL2dvb2dsZS9hbmRyb2lkL2RhdGF0cmFuc3BvcnQvcnVudGltZS9iYWNrZW5kcy9UcmFuc3BvcnRCYWNrZW5kOzoUCGQSEExqYXZhL3V0aWwvTGlzdDs6NwhlEjNMY29tL2dvb2dsZS9maXJlYmFzZS9jb21wb25lbnRzL0NvbXBvbmVudENvbnRhaW5lcjs6NAhmEjBMY29tL2dvb2dsZS9maXJlYmFzZS9hYnQvY29tcG9uZW50L0FidENvbXBvbmVudDs6QAhnEjxMY29tL2dvb2dsZS9maXJlYmFzZS9hbmFseXRpY3MvY29ubmVjdG9yL0FuYWx5dGljc0Nvbm5lY3Rvcjs6NwhoEjNMY29tL2dvb2dsZS9hbmRyb2lkL2RhdGF0cmFuc3BvcnQvVHJhbnNwb3J0RmFjdG9yeTs6QAhpEjxMY29tL2dvb2dsZS9maXJlYmFzZS9pbnN0YWxsYXRpb25zL0ZpcmViYXNlSW5zdGFsbGF0aW9uc0FwaTs6NQhqEjFMY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvRmlyZWJhc2VNZXNzYWdpbmc7OjAIaxIsTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9GaXJlYmFzZVBlcmZFYXJseTs6MghsEi5MY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL0ZpcmViYXNlUGVyZm9ybWFuY2U7OiwIbRIoTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi91dGlsL09wdGlvbmFsOzpACG4SPExjb20vZ29vZ2xlL2ZpcmViYXNlL3JlbW90ZWNvbmZpZy9GaXJlYmFzZVJlbW90ZUNvbmZpZ1ZhbHVlOzoWCG8SEkxqYXZhL2xhbmcvT2JqZWN0OzodCHASGUxhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDs6FwhxEhNMamF2YS9sYW5nL0Jvb2xlYW47OhkIchIVTGphdmEvbGFuZy9FeGNlcHRpb247OhMIcxIPTGphdmEvdXRpbC9NYXA7Oj8IdBI7TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9zZXNzaW9uL2dhdWdlcy9DcHVHYXVnZUNvbGxlY3Rvcjs6Qgh1Ej5MY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3Nlc3Npb24vZ2F1Z2VzL01lbW9yeUdhdWdlQ29sbGVjdG9yOzopCHYSJUxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdXRpbC9UaW1lcjs6Lwh3EitMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0dhdWdlTWV0YWRhdGE7OjwIeBI4TGNvbS9nb29nbGUvZmlyZWJhc2UvcmVtb3RlY29uZmlnL1JlbW90ZUNvbmZpZ0NvbXBvbmVudDs6Mwh5Ei9MY29tL2dvb2dsZS9maXJlYmFzZS9zZXNzaW9ucy9GaXJlYmFzZVNlc3Npb25zOzozCHoSL0xjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL1Nlc3Npb25HZW5lcmF0b3I7OjoIexI2TGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvU2Vzc2lvbkZpcmVsb2dQdWJsaXNoZXI7OjwIfBI4TGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvc2V0dGluZ3MvU2Vzc2lvbnNTZXR0aW5nczs6Mwh9Ei9MY29tL2dvb2dsZS9maXJlYmFzZS9zZXNzaW9ucy9TZXNzaW9uRGF0YXN0b3JlOzpACH4SPExjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL1Nlc3Npb25MaWZlY3ljbGVTZXJ2aWNlQmluZGVyOzpOCH8SSkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2R5bmFtaXRlL0R5bmFtaXRlTW9kdWxlJER5bmFtaXRlTG9hZGVyQ2xhc3NMb2FkZXI7Om8IgAESakxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2R5bmFtaXRlL2Rlc2NyaXB0b3JzL2NvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvZHluYW1pdGUvTW9kdWxlRGVzY3JpcHRvcjs6UAiBARJLTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvQXBwTWVhc3VyZW1lbnREeW5hbWl0ZVNlcnZpY2U7OhwIggESF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7OjcIgwESMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Yng7OhgIhAESE0xhbmRyb2lkL29zL1BhcmNlbDs6NwiFARIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpkbTs6NwiGARIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpkajs6GAiHARITTGFuZHJvaWQvb3MvQnVuZGxlOzo3CIgBEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emRvOzo0CIkBEi9MY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9keW5hbWljL0lPYmplY3RXcmFwcGVyOzo3CIoBEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emR3Ozo3CIsBEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emRwOzo3CIwBEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emR1OzodCI0BEhhMYW5kcm9pZC9jb250ZW50L0ludGVudDs6HwiOARIaTGFuZHJvaWR4L2Fubm90YXRpb24vS2VlcDs6OAiPARIzTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2Fubm90YXRpb24vS2VlcE5hbWU7OjUIkAESMExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi91dGlsL0R5bmFtaXRlQXBpOzomCJEBEiFMYW5kcm9pZHgvd29yay9pbXBsL1dvcmtEYXRhYmFzZTs6KwiSARImTGFuZHJvaWR4L3dvcmsvaW1wbC9Xb3JrRGF0YWJhc2VfSW1wbDs6RQiTARJATGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGFiYXNlL05pYURhdGFiYXNlOzpKCJQBEkVMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvZGF0YWJhc2UvTmlhRGF0YWJhc2VfSW1wbDs6QQiVARI8TGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS90cmFjaW5nL0NvbXBvc2VUcmFjaW5nSW5pdGlhbGl6ZXI7OjIIlgESLUxhbmRyb2lkeC9lbW9qaTIvdGV4dC9FbW9qaUNvbXBhdEluaXRpYWxpemVyOzo1CJcBEjBMYW5kcm9pZHgvbGlmZWN5Y2xlL1Byb2Nlc3NMaWZlY3ljbGVJbml0aWFsaXplcjs6PAiYARI3TGFuZHJvaWR4L3Byb2ZpbGVpbnN0YWxsZXIvUHJvZmlsZUluc3RhbGxlckluaXRpYWxpemVyOzo6CJkBEjVMYW5kcm9pZHgvdHJhY2luZy9wZXJmZXR0by9TdGFydHVwVHJhY2luZ0luaXRpYWxpemVyOzorCJoBEiZMYW5kcm9pZHgvd29yay9Xb3JrTWFuYWdlckluaXRpYWxpemVyOzorCJsBEiZMYW5kcm9pZHgvY29yZS9hcHAvUmVtb3RlQWN0aW9uQ29tcGF0OzoxCJwBEixMYW5kcm9pZHgvY29yZS9ncmFwaGljcy9kcmF3YWJsZS9JY29uQ29tcGF0Ozo9CJ0BEjhMYW5kcm9pZHgvdmVyc2lvbmVkcGFyY2VsYWJsZS9DdXN0b21WZXJzaW9uZWRQYXJjZWxhYmxlOzo6CJ4BEjVMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL05pYVN0YXJ0dXBUYXNrOzoyCJ8BEi1MY29tL2dvb2dsZS9maXJlYmFzZS9GaXJlYmFzZUNvbW1vblJlZ2lzdHJhcjs6OAigARIzTGNvbS9nb29nbGUvZmlyZWJhc2UvY29uY3VycmVudC9FeGVjdXRvcnNSZWdpc3RyYXI7OjsIoQESNkxjb20vZ29vZ2xlL2ZpcmViYXNlL2NyYXNobHl0aWNzL0NyYXNobHl0aWNzUmVnaXN0cmFyOzpKCKIBEkVMY29tL2dvb2dsZS9maXJlYmFzZS9pbnN0YWxsYXRpb25zL0ZpcmViYXNlSW5zdGFsbGF0aW9uc0t0eFJlZ2lzdHJhcjs6TgijARJJTGNvbS9nb29nbGUvZmlyZWJhc2UvaW5zdGFsbGF0aW9ucy9rdHgvRmlyZWJhc2VJbnN0YWxsYXRpb25zS3R4UmVnaXN0cmFyOzpCCKQBEj1MY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvRmlyZWJhc2VNZXNzYWdpbmdLdHhSZWdpc3RyYXI7OkYIpQESQUxjb20vZ29vZ2xlL2ZpcmViYXNlL21lc3NhZ2luZy9rdHgvRmlyZWJhc2VNZXNzYWdpbmdLdHhSZWdpc3RyYXI7OiUIpgESIExhbmRyb2lkeC93b3JrL1dvcmtlclBhcmFtZXRlcnM7OkEIpwESPExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC9SZWZsZWN0ZWRQYXJjZWxhYmxlOzpXCKgBElJMYW5kcm9pZHgvd2luZG93L2FyZWEvcmVmbGVjdGlvbmd1YXJkL0V4dGVuc2lvbldpbmRvd0FyZWFQcmVzZW50YXRpb25SZXF1aXJlbWVudHM7OlEIqQESTExhbmRyb2lkeC93aW5kb3cvYXJlYS9yZWZsZWN0aW9uZ3VhcmQvRXh0ZW5zaW9uV2luZG93QXJlYVN0YXR1c1JlcXVpcmVtZW50czs6TwiqARJKTGFuZHJvaWR4L3dpbmRvdy9hcmVhL3JlZmxlY3Rpb25ndWFyZC9XaW5kb3dBcmVhQ29tcG9uZW50QXBpM1JlcXVpcmVtZW50czs6GAirARITTGFuZHJvaWQvdmlldy9WaWV3OzoiCKwBEh1MYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzOzo9CK0BEjhMYW5kcm9pZHgvd2luZG93L2V4dGVuc2lvbnMvY29yZS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyOzpGCK4BEkFMYW5kcm9pZHgvd2luZG93L2V4dGVuc2lvbnMvYXJlYS9FeHRlbnNpb25XaW5kb3dBcmVhUHJlc2VudGF0aW9uOzobCK8BEhZMYW5kcm9pZC9hcHAvQWN0aXZpdHk7OisIsAESJkxhbmRyb2lkeC93aW5kb3cvcmVmbGVjdGlvbi9Db25zdW1lcjI7OiwIsQESJ0xhbmRyb2lkeC93aW5kb3cvcmVmbGVjdGlvbi9KRnVuY3Rpb24yOzosCLIBEidMYW5kcm9pZHgvd2luZG93L3JlZmxlY3Rpb24vUHJlZGljYXRlMjs6OgizARI1TGFuZHJvaWQvc3VwcG9ydC92NC9hcHAvUmVtb3RlQWN0aW9uQ29tcGF0UGFyY2VsaXplcjs6QAi0ARI7TGFuZHJvaWQvc3VwcG9ydC92NC9ncmFwaGljcy9kcmF3YWJsZS9JY29uQ29tcGF0UGFyY2VsaXplcjs6Mwi1ARIuTGFuZHJvaWR4L3ZlcnNpb25lZHBhcmNlbGFibGUvVmVyc2lvbmVkUGFyY2VsOzo1CLYBEjBMYW5kcm9pZHgvY29yZS9hcHAvUmVtb3RlQWN0aW9uQ29tcGF0UGFyY2VsaXplcjs6Owi3ARI2TGFuZHJvaWR4L2NvcmUvZ3JhcGhpY3MvZHJhd2FibGUvSWNvbkNvbXBhdFBhcmNlbGl6ZXI7Oi4IuAESKUxhbmRyb2lkeC92ZXJzaW9uZWRwYXJjZWxhYmxlL1BhcmNlbEltcGw7OlQIuQEST0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvc3luYy93b3JrZXJzL0hpbHRXb3JrZXJGYWN0b3J5RW50cnlQb2ludDs6Wgi6ARJVTGRhZ2dlci9oaWx0L2FuZHJvaWQvaW50ZXJuYWwvbGlmZWN5Y2xlL0RlZmF1bHRWaWV3TW9kZWxGYWN0b3JpZXMkQWN0aXZpdHlFbnRyeVBvaW50OzpcCLsBEldMZGFnZ2VyL2hpbHQvYW5kcm9pZC9pbnRlcm5hbC9saWZlY3ljbGUvSGlsdFZpZXdNb2RlbEZhY3RvcnkkQWN0aXZpdHlDcmVhdG9yRW50cnlQb2ludDs6Xwi8ARJaTGRhZ2dlci9oaWx0L2FuZHJvaWQvaW50ZXJuYWwvbGlmZWN5Y2xlL0hpbHRWaWV3TW9kZWxGYWN0b3J5JFZpZXdNb2RlbEZhY3Rvcmllc0VudHJ5UG9pbnQ7OmgIvQESY0xkYWdnZXIvaGlsdC9hbmRyb2lkL2ludGVybmFsL2xpZmVjeWNsZS9IaWx0V3JhcHBlcl9IaWx0Vmlld01vZGVsRmFjdG9yeV9BY3Rpdml0eUNyZWF0b3JFbnRyeVBvaW50OzpoCL4BEmNMZGFnZ2VyL2hpbHQvYW5kcm9pZC9pbnRlcm5hbC9tYW5hZ2Vycy9BY3Rpdml0eUNvbXBvbmVudE1hbmFnZXIkQWN0aXZpdHlDb21wb25lbnRCdWlsZGVyRW50cnlQb2ludDs6eAi/ARJzTGRhZ2dlci9oaWx0L2FuZHJvaWQvaW50ZXJuYWwvbWFuYWdlcnMvQWN0aXZpdHlSZXRhaW5lZENvbXBvbmVudE1hbmFnZXIkQWN0aXZpdHlSZXRhaW5lZENvbXBvbmVudEJ1aWxkZXJFbnRyeVBvaW50OzpxCMABEmxMZGFnZ2VyL2hpbHQvYW5kcm9pZC9pbnRlcm5hbC9tYW5hZ2Vycy9BY3Rpdml0eVJldGFpbmVkQ29tcG9uZW50TWFuYWdlciRBY3Rpdml0eVJldGFpbmVkTGlmZWN5Y2xlRW50cnlQb2ludDs6ZgjBARJhTGRhZ2dlci9oaWx0L2FuZHJvaWQvaW50ZXJuYWwvbWFuYWdlcnMvU2VydmljZUNvbXBvbmVudE1hbmFnZXIkU2VydmljZUNvbXBvbmVudEJ1aWxkZXJFbnRyeVBvaW50OzpKCMIBEkVMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL01haW5BY3Rpdml0eV9HZW5lcmF0ZWRJbmplY3Rvcjs6TAjDARJHTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9OaWFBcHBsaWNhdGlvbl9HZW5lcmF0ZWRJbmplY3Rvcjs6ZAjEARJfTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9zeW5jL3NlcnZpY2VzL1N5bmNOb3RpZmljYXRpb25zU2VydmljZV9HZW5lcmF0ZWRJbmplY3Rvcjs6WAjFARJTTGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL0FuaW1hdGVkQ29udGVudFRyYW5zaXRpb25TY29wZUltcGwkU2l6ZU1vZGlmaWVyRWxlbWVudDs6PAjGARI3TGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL0VudGVyRXhpdFRyYW5zaXRpb25FbGVtZW50Ozo0CMcBEi9MYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL0JhY2tncm91bmRFbGVtZW50Ozo8CMgBEjdMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL0JvcmRlck1vZGlmaWVyTm9kZUVsZW1lbnQ7OjMIyQESLkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vQ2xpY2thYmxlRWxlbWVudDs6OwjKARI2TGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9Db21iaW5lZENsaWNrYWJsZUVsZW1lbnQ7OjQIywESL0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vRm9jdXNHcm91cEVsZW1lbnQ7OjMIzAESLkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vRm9jdXNhYmxlRWxlbWVudDs6MwjNARIuTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9Ib3ZlcmFibGVFbGVtZW50Ozo8CM4BEjdMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL0luZGljYXRpb25Nb2RpZmllckVsZW1lbnQ7OjMIzwESLkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vTWFnbmlmaWVyRWxlbWVudDs6OAjQARIzTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9TY3JvbGxhYmxlQXJlYUVsZW1lbnQ7OjkI0QESNExhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vU2Nyb2xsaW5nTGF5b3V0RWxlbWVudDs6WAjSARJTTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9kcmFnYW5kZHJvcC9EcmFnQW5kRHJvcFNvdXJjZVdpdGhEZWZhdWx0U2hhZG93RWxlbWVudDs6PAjTARI3TGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9nZXN0dXJlcy9EcmFnZ2FibGVFbGVtZW50Ozo9CNQBEjhMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2dlc3R1cmVzL1Njcm9sbGFibGVFbGVtZW50OzpGCNUBEkFMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9BbGlnbm1lbnRMaW5lT2Zmc2V0RHBFbGVtZW50Ozo9CNYBEjhMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9Cb3hDaGlsZERhdGFFbGVtZW50OzpHCNcBEkJMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9Db25zdW1lZEluc2V0c01vZGlmaWVyRWxlbWVudDs6RgjYARJBTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvRGVyaXZlZEhlaWdodE1vZGlmaWVyRWxlbWVudDs6NQjZARIwTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvRmlsbEVsZW1lbnQ7OkAI2gESO0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L0hvcml6b250YWxBbGlnbkVsZW1lbnQ7OkYI2wESQUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L0luc2V0c1BhZGRpbmdNb2RpZmllckVsZW1lbnQ7Oj8I3AESOkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L0ludHJpbnNpY1dpZHRoRWxlbWVudDs6PQjdARI4TGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvTGF5b3V0V2VpZ2h0RWxlbWVudDs6OAjeARIzTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvUGFkZGluZ0VsZW1lbnQ7Ok8I3wESSkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L1BhZGRpbmdWYWx1ZXNDb25zdW1pbmdNb2RpZmllckVsZW1lbnQ7Oj4I4AESOUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L1BhZGRpbmdWYWx1ZXNFbGVtZW50Ozo1COEBEjBMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9TaXplRWxlbWVudDs6TQjiARJITGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvVW5pb25JbnNldHNDb25zdW1pbmdNb2RpZmllckVsZW1lbnQ7OkcI4wESQkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L1Vuc3BlY2lmaWVkQ29uc3RyYWludHNFbGVtZW50Ozo8COQBEjdMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9XcmFwQ29udGVudEVsZW1lbnQ7OksI5QESRkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF6eS9sYXlvdXQvTGF6eUxheW91dEFuaW1hdGVJdGVtRWxlbWVudDs6VAjmARJPTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXp5L2xheW91dC9MYXp5TGF5b3V0QmV5b25kQm91bmRzTW9kaWZpZXJFbGVtZW50OzpoCOcBEmNMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xhenkvbGF5b3V0L0xhenlMYXlvdXRJdGVtQW5pbWF0b3IkRGlzcGxheWluZ0Rpc2FwcGVhcmluZ0l0ZW1zRWxlbWVudDs6SgjoARJFTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXp5L2xheW91dC9MYXp5TGF5b3V0U2VtYW50aWNzTW9kaWZpZXI7OlYI6QESUUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF6eS9sYXlvdXQvVHJhdmVyc2FibGVQcmVmZXRjaFN0YXRlTW9kaWZpZXJFbGVtZW50OzpLCOoBEkZMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3JlbG9jYXRpb24vQnJpbmdJbnRvVmlld1JlcXVlc3RlckVsZW1lbnQ7Oj4I6wESOUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vc2VsZWN0aW9uL1NlbGVjdGFibGVFbGVtZW50Ozo+COwBEjlMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3NlbGVjdGlvbi9Ub2dnbGVhYmxlRWxlbWVudDs6bwjtARJqTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi90ZXh0L2NvbnRleHRtZW51L21vZGlmaWVyL0FkZFRleHRDb250ZXh0TWVudURhdGFDb21wb25lbnRzV2l0aENvbnRleHRFbGVtZW50OzpaCO4BElVMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvY29udGV4dG1lbnUvbW9kaWZpZXIvVGV4dENvbnRleHRNZW51R2VzdHVyZUVsZW1lbnQ7OmEI7wESXExhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9jb250ZXh0bWVudS9tb2RpZmllci9UZXh0Q29udGV4dE1lbnVUb29sYmFySGFuZGxlckVsZW1lbnQ7OkwI8AESR0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9oYW5kd3JpdGluZy9TdHlsdXNIYW5kd3JpdGluZ0VsZW1lbnQ7OlUI8QESUExhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9pbnB1dC9pbnRlcm5hbC9Db3JlVGV4dEZpZWxkU2VtYW50aWNzTW9kaWZpZXI7Ol4I8gESWUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9pbnB1dC9pbnRlcm5hbC9MZWdhY3lBZGFwdGluZ1BsYXRmb3JtVGV4dElucHV0TW9kaWZpZXI7OlYI8wESUUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9tb2RpZmllcnMvU2VsZWN0YWJsZVRleHRBbm5vdGF0ZWRTdHJpbmdFbGVtZW50OzpMCPQBEkdMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvbW9kaWZpZXJzL1RleHRBbm5vdGF0ZWRTdHJpbmdFbGVtZW50OzpJCPUBEkRMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvbW9kaWZpZXJzL1RleHRTdHJpbmdTaW1wbGVFbGVtZW50Ozo2CPYBEjFMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvSW5kaWNhdG9yTGluZUVsZW1lbnQ7OjwI9wESN0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9NaW5pbXVtSW50ZXJhY3RpdmVNb2RpZmllcjs6Rgj4ARJBTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9BbmltYXRlQm91bmRzRWxlbWVudDs6RQj5ARJATGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9BbmltYXRlZFBhbmVFbGVtZW50OzpECPoBEj9MYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvYWRhcHRpdmUvbGF5b3V0L1BhbmVNYXJnaW5zRWxlbWVudDs6SAj7ARJDTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9QcmVmZXJyZWRIZWlnaHRFbGVtZW50OzpHCPwBEkJMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvYWRhcHRpdmUvbGF5b3V0L1ByZWZlcnJlZFdpZHRoRWxlbWVudDs6VAj9ARJPTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9pbnRlcm5hbC9EZWxlZ2FibGVTZW1hbnRpY3NFbGVtZW50OzpECP4BEj9MYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvaW50ZXJuYWwvQ2hpbGRTZW1hbnRpY3NOb2RlRWxlbWVudDs6RQj/ARJATGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2ludGVybmFsL1BhcmVudFNlbWFudGljc05vZGVFbGVtZW50OzpLCIACEkZMYW5kcm9pZHgvY29tcG9zZS91aS9kcmFnYW5kZHJvcC9BbmRyb2lkRHJhZ0FuZERyb3BNYW5hZ2VyJG1vZGlmaWVyJDE7OjEIgQISLExhbmRyb2lkeC9jb21wb3NlL3VpL2RyYXcvRHJhd0JlaGluZEVsZW1lbnQ7OjQIggISL0xhbmRyb2lkeC9jb21wb3NlL3VpL2RyYXcvRHJhd1dpdGhDYWNoZUVsZW1lbnQ7OjYIgwISMUxhbmRyb2lkeC9jb21wb3NlL3VpL2RyYXcvRHJhd1dpdGhDb250ZW50RWxlbWVudDs6LgiEAhIpTGFuZHJvaWR4L2NvbXBvc2UvdWkvZHJhdy9QYWludGVyRWxlbWVudDs6OgiFAhI1TGFuZHJvaWR4L2NvbXBvc2UvdWkvZHJhdy9TaGFkb3dHcmFwaGljc0xheWVyRWxlbWVudDs6NAiGAhIvTGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvRm9jdXNDaGFuZ2VkRWxlbWVudDs6OgiHAhI1TGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvRm9jdXNPd25lckltcGwkbW9kaWZpZXIkMTs6NwiIAhIyTGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvRm9jdXNQcm9wZXJ0aWVzRWxlbWVudDs6NgiJAhIxTGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvRm9jdXNSZXF1ZXN0ZXJFbGVtZW50Ozo9CIoCEjhMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9CbG9ja0dyYXBoaWNzTGF5ZXJFbGVtZW50Ozo4CIsCEjNMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9HcmFwaGljc0xheWVyRWxlbWVudDs6NAiMAhIvTGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQva2V5L0tleUlucHV0RWxlbWVudDs6SAiNAhJDTGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9Qb2ludGVySG92ZXJJY29uTW9kaWZpZXJFbGVtZW50OzpHCI4CEkJMYW5kcm9pZHgvY29tcG9zZS91aS9pbnB1dC9wb2ludGVyL1N0eWx1c0hvdmVySWNvbk1vZGlmaWVyRWxlbWVudDs6QwiPAhI+TGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9TdXNwZW5kUG9pbnRlcklucHV0RWxlbWVudDs6LwiQAhIqTGFuZHJvaWR4L2NvbXBvc2UvdWkvbGF5b3V0L0xheW91dEVsZW1lbnQ7OjEIkQISLExhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9MYXlvdXRJZEVsZW1lbnQ7Oj0IkgISOExhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9Pbkdsb2JhbGx5UG9zaXRpb25lZEVsZW1lbnQ7OjcIkwISMkxhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9PblNpemVDaGFuZ2VkTW9kaWZpZXI7Oj8IlAISOkxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FuZHJvaWRDb21wb3NlVmlldyRyb290JDEkMTs6MgiVAhItTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vVGVzdFRhZ0VsZW1lbnQ7Oj0IlgISOExhbmRyb2lkeC9jb21wb3NlL3VpL3NlbWFudGljcy9BcHBlbmRlZFNlbWFudGljc0VsZW1lbnQ7OkAIlwISO0xhbmRyb2lkeC9jb21wb3NlL3VpL3NlbWFudGljcy9DbGVhckFuZFNldFNlbWFudGljc0VsZW1lbnQ7OmQImAISX0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kZXNpZ25zeXN0ZW0vY29tcG9uZW50L3Njcm9sbGJhci9TY3JvbGxUaHVtYkVsZW1lbnQ7OkEImQISPExjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvTWFpbkFjdGl2aXR5Vmlld01vZGVsOzpVCJoCElBMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvYm9va21hcmtzL2ltcGwvQm9va21hcmtzVmlld01vZGVsOzpPCJsCEkpMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvZm9yeW91L2ltcGwvRm9yWW91Vmlld01vZGVsOzpVCJwCElBMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvaW50ZXJlc3RzL2ltcGwvSW50ZXJlc3RzVmlld01vZGVsOzpPCJ0CEkpMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvc2VhcmNoL2ltcGwvU2VhcmNoVmlld01vZGVsOzpTCJ4CEk5MY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2ZlYXR1cmUvc2V0dGluZ3MvaW1wbC9TZXR0aW5nc1ZpZXdNb2RlbDs6TQifAhJITGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL3RvcGljL2ltcGwvVG9waWNWaWV3TW9kZWw7OiUIoAISIExrb3RsaW4vY29yb3V0aW5lcy9Db250aW51YXRpb247OhkIoQISFExyZXRyb2ZpdDIvUmVzcG9uc2U7OkIIogISPUxhbmRyb2lkeC93aW5kb3cvbGF5b3V0L2FkYXB0ZXIvZXh0ZW5zaW9ucy9NdWx0aWNhc3RDb25zdW1lcjs6OQijAhI0TGFuZHJvaWR4L3dpbmRvdy9leHRlbnNpb25zL2xheW91dC9XaW5kb3dMYXlvdXRJbmZvOzo4CKQCEjNMY29tL2dvb2dsZS9maXJlYmFzZS9jb21wb25lbnRzL0NvbXBvbmVudFJlZ2lzdHJhcjs6LAilAhInTGFuZHJvaWR4L2dyYXBoaWNzL3BhdGgvQ29uaWNDb252ZXJ0ZXI7OjYIpgISMUxhbmRyb2lkeC9ncmFwaGljcy9wYXRoL1BhdGhJdGVyYXRvclByZUFwaTM0SW1wbDs6MwinAhIuTGFuZHJvaWR4L3RyYWNpbmcvcGVyZmV0dG8vam5pL1BlcmZldHRvTmF0aXZlOzoHCKgCEgJbRjoGCKkCEgFGOhwIqgISF0xhbmRyb2lkL2dyYXBoaWNzL1BhdGg7OlAIqwISS0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L0FwcE1lYXN1cmVtZW50JENvbmRpdGlvbmFsVXNlclByb3BlcnR5OzotCKwCEihMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL21ldHJpY3MvVHJhY2U7OiQIrQISH0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjs6QwiuAhI+TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2FwaS9pbnRlcm5hbC9MaWZlY3ljbGVDYWxsYmFjazs6OAivAhIzTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvQXBwTWVhc3VyZW1lbnQ7OjYIsAISMUxjb20vZ29vZ2xlL2ZpcmViYXNlL2FuYWx5dGljcy9GaXJlYmFzZUFuYWx5dGljczs6NQixAhIwTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi9tZXRyaWNzL0FwcFN0YXJ0VHJhY2U7Oj4IsgISOUxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvbmV0d29yay9GaXJlYmFzZVBlcmZIdHRwQ2xpZW50OzpACLMCEjtMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL25ldHdvcmsvRmlyZWJhc2VQZXJmT2tIdHRwQ2xpZW50OzpBCLQCEjxMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL25ldHdvcmsvRmlyZWJhc2VQZXJmVXJsQ29ubmVjdGlvbjs6Rgi1AhJBTGNvbS9nb29nbGUvZmlyZWJhc2UvcmVtb3RlY29uZmlnL2ludGVybmFsL0NvbmZpZ0ZldGNoSHR0cENsaWVudDs6Qwi2AhI+TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2FwaS9pbnRlcm5hbC9MaWZlY3ljbGVBY3Rpdml0eTs6Qwi3AhI+TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2FwaS9pbnRlcm5hbC9MaWZlY3ljbGVGcmFnbWVudDs6Nwi4AhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenpsYjs6Jgi5AhIhTGNvbS9nb29nbGUvZmlyZWJhc2UvRmlyZWJhc2VBcHA7OigIugISI0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0h0dHBDbGllbnQ7Oh8IuwISGkxvcmcvYXBhY2hlL2h0dHAvSHR0cEhvc3Q7OiIIvAISHUxvcmcvYXBhY2hlL2h0dHAvSHR0cFJlcXVlc3Q7Oi0IvQISKExvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjs6Kwi+AhImTG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDs6NAi/AhIvTG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvbWV0aG9kcy9IdHRwVXJpUmVxdWVzdDs6IwjAAhIeTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2U7OhMIwQISDkxva2h0dHAzL0NhbGw7OhcIwgISEkxva2h0dHAzL0NhbGxiYWNrOzoXCMMCEhJMb2todHRwMy9SZXNwb25zZTs6EwjEAhIOTGphdmEvbmV0L1VSTDs6FwjFAhISW0xqYXZhL2xhbmcvQ2xhc3M7OhoIxgISFUxqYXZhL2lvL0lucHV0U3RyZWFtOzohCMcCEhxMamF2YS9uZXQvSHR0cFVSTENvbm5lY3Rpb247OhUIyAISEExqYXZhL2xhbmcvTG9uZzs6FQjJAhIQTGphdmEvdXRpbC9EYXRlOzpRCMoCEkxMY29tL2dvb2dsZS9maXJlYmFzZS9yZW1vdGVjb25maWcvaW50ZXJuYWwvQ29uZmlnRmV0Y2hIYW5kbGVyJEZldGNoUmVzcG9uc2U7OigIywISI0xhbmRyb2lkeC9saWZlY3ljbGUvUmVwb3J0RnJhZ21lbnQ7OkcIzAISQkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFRleHRWaWV3QXV0b1NpemVIZWxwZXIkSW1wbDIzOzooCM0CEiNMYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dCRCdWlsZGVyOzoeCM4CEhlMYW5kcm9pZC93aWRnZXQvVGV4dFZpZXc7OkcIzwISQkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFRleHRWaWV3QXV0b1NpemVIZWxwZXIkSW1wbDI5OzpFCNACEkBMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRUZXh0Vmlld0F1dG9TaXplSGVscGVyJEltcGw7OkUI0QISQExhbmRyb2lkeC9jb3JlL2FwcC9Ob3RpZmljYXRpb25Db21wYXQkQmlnUGljdHVyZVN0eWxlJEFwaTIzSW1wbDs6LwjSAhIqTGFuZHJvaWQvYXBwL05vdGlmaWNhdGlvbiRCaWdQaWN0dXJlU3R5bGU7OiUI0wISIExhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0ljb247OkUI1AISQExhbmRyb2lkeC9jb3JlL2FwcC9Ob3RpZmljYXRpb25Db21wYXQkQmlnUGljdHVyZVN0eWxlJEFwaTMxSW1wbDs6HQjVAhIYTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7OkQI1gISP0xhbmRyb2lkeC9jb3JlL2FwcC9Ob3RpZmljYXRpb25Db21wYXQkQnViYmxlTWV0YWRhdGEkQXBpMjlJbXBsOzo6CNcCEjVMYW5kcm9pZHgvY29yZS9hcHAvTm90aWZpY2F0aW9uQ29tcGF0JEJ1YmJsZU1ldGFkYXRhOzouCNgCEilMYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uJEJ1YmJsZU1ldGFkYXRhOzpECNkCEj9MYW5kcm9pZHgvY29yZS9hcHAvTm90aWZpY2F0aW9uQ29tcGF0JEJ1YmJsZU1ldGFkYXRhJEFwaTMwSW1wbDs6PQjaAhI4TGFuZHJvaWR4L2NvcmUvYXBwL05vdGlmaWNhdGlvbkNvbXBhdCRCdWlsZGVyJEFwaTIxSW1wbDs6LAjbAhInTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXI7OiQI3AISH0xhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczs6LgjdAhIpTGFuZHJvaWR4L2NvcmUvdmlldy9WaWV3Q29tcGF0JEFwaTIwSW1wbDs6IAjeAhIbTGFuZHJvaWQvdmlldy9XaW5kb3dJbnNldHM7OjAI3wISK0xhbmRyb2lkeC9jb3JlL3ZpZXcvVmlld0NvbXBhdCRBcGkyMUltcGwkMTs6NQjgAhIwTGFuZHJvaWR4L2NvcmUvdmlldy9PbkFwcGx5V2luZG93SW5zZXRzTGlzdGVuZXI7Oi4I4QISKUxhbmRyb2lkeC9jb3JlL3ZpZXcvVmlld0NvbXBhdCRBcGkyMUltcGw7OiwI4gISJ0xhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0OzocCOMCEhdMYW5kcm9pZC9ncmFwaGljcy9SZWN0OzopCOQCEiRMYW5kcm9pZC9jb250ZW50L3Jlcy9Db2xvclN0YXRlTGlzdDs6JwjlAhIiTGFuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZiRNb2RlOzouCOYCEilMYW5kcm9pZHgvY29yZS92aWV3L1ZpZXdDb21wYXQkQXBpMjNJbXBsOzouCOcCEilMYW5kcm9pZHgvY29yZS92aWV3L1ZpZXdDb21wYXQkQXBpMjhJbXBsOzouCOgCEilMYW5kcm9pZHgvY29yZS92aWV3L1ZpZXdDb21wYXQkQXBpMjlJbXBsOzouCOkCEilMYW5kcm9pZC92aWV3L1ZpZXckQWNjZXNzaWJpbGl0eURlbGVnYXRlOzoHCOoCEgJbSTogCOsCEhtMYW5kcm9pZC91dGlsL0F0dHJpYnV0ZVNldDs6JQjsAhIgTGFuZHJvaWQvY29udGVudC9yZXMvVHlwZWRBcnJheTs6LgjtAhIpTGFuZHJvaWR4L2NvcmUvdmlldy9WaWV3Q29tcGF0JEFwaTMwSW1wbDs6LgjuAhIpTGFuZHJvaWR4L2NvcmUvdmlldy9WaWV3Q29tcGF0JEFwaTMxSW1wbDs6GAjvAhITW0xqYXZhL2xhbmcvU3RyaW5nOzorCPACEiZMYW5kcm9pZHgvY29yZS92aWV3L0NvbnRlbnRJbmZvQ29tcGF0Ozo6CPECEjVMYW5kcm9pZHgvY29yZS92aWV3L1dpbmRvd0luc2V0c0NvbXBhdCRCdWlsZGVySW1wbDIwOzokCPICEh9MYW5kcm9pZHgvY29yZS9ncmFwaGljcy9JbnNldHM7OjoI8wISNUxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEJ1aWxkZXJJbXBsMjk7OjoI9AISNUxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEJ1aWxkZXJJbXBsMzA7OjoI9QISNUxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEJ1aWxkZXJJbXBsMzQ7OjgI9gISM0xhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEJ1aWxkZXJJbXBsOzozCPcCEi5MYW5kcm9pZHgvY29yZS92aWV3L1dpbmRvd0luc2V0c0NvbXBhdCRJbXBsMjA7OiUI+AISIFtMYW5kcm9pZHgvY29yZS9ncmFwaGljcy9JbnNldHM7OjMI+QISLkxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEltcGwyMTs6Mwj6AhIuTGFuZHJvaWR4L2NvcmUvdmlldy9XaW5kb3dJbnNldHNDb21wYXQkSW1wbDI4OzotCPsCEihMYW5kcm9pZHgvY29yZS92aWV3L0Rpc3BsYXlDdXRvdXRDb21wYXQ7OjMI/AISLkxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEltcGwyOTs6Mwj9AhIuTGFuZHJvaWR4L2NvcmUvdmlldy9XaW5kb3dJbnNldHNDb21wYXQkSW1wbDMwOzozCP4CEi5MYW5kcm9pZHgvY29yZS92aWV3L1dpbmRvd0luc2V0c0NvbXBhdCRJbXBsMzQ7OjEI/wISLExhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JEltcGw7OjcIgAMSMkxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JFR5cGVJbXBsMzA7OjcIgQMSMkxhbmRyb2lkeC9jb3JlL3ZpZXcvV2luZG93SW5zZXRzQ29tcGF0JFR5cGVJbXBsMzQ7OjYIggMSMUxhbmRyb2lkeC9jb3JlL3dpZGdldC9FZGdlRWZmZWN0Q29tcGF0JEFwaTIxSW1wbDs6IAiDAxIbTGFuZHJvaWQvd2lkZ2V0L0VkZ2VFZmZlY3Q7OjYIhAMSMUxhbmRyb2lkeC9jb3JlL3dpZGdldC9FZGdlRWZmZWN0Q29tcGF0JEFwaTMxSW1wbDs6KgiFAxIlTGFuZHJvaWR4L2FjdGl2aXR5L0NvbXBvbmVudEFjdGl2aXR5OzovCIYDEipMYW5kcm9pZHgvYXBwY29tcGF0L2FwcC9BcHBDb21wYXRBY3Rpdml0eTs6RAiHAxI/TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1Byb3RvJFByZWZlcmVuY2VNYXA7OjUIiAMSMExhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvUGFyc2VyOzo7CIkDEjZMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL01hcEZpZWxkTGl0ZTs6QAiKAxI7TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1Byb3RvJFN0cmluZ1NldDs6RAiLAxI/TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9JbnRlcm5hbCRQcm90b2J1Zkxpc3Q7OjwIjAMSN0xhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZXNQcm90byRWYWx1ZTs6QgiNAxI9TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlOzpDCI4DEj5MYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlOzpCCI8DEj1MYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldExpdGU7Ok8IkAMSSkxhbmRyb2lkeC9saWZlY3ljbGUvUHJvY2Vzc0xpZmVjeWNsZU93bmVyJGF0dGFjaCQxJG9uQWN0aXZpdHlQcmVDcmVhdGVkJDE7Oi8IkQMSKkxhbmRyb2lkeC9saWZlY3ljbGUvUHJvY2Vzc0xpZmVjeWNsZU93bmVyOzo4CJIDEjNMYW5kcm9pZHgvbGlmZWN5Y2xlL1Byb2Nlc3NMaWZlY3ljbGVPd25lciRhdHRhY2gkMTs6OQiTAxI0TGFuZHJvaWR4L2xpZmVjeWNsZS9FbXB0eUFjdGl2aXR5TGlmZWN5Y2xlQ2FsbGJhY2tzOzpICJQDEkNMYW5kcm9pZHgvbGlmZWN5Y2xlL0xpZmVjeWNsZURpc3BhdGNoZXIkRGlzcGF0Y2hlckFjdGl2aXR5Q2FsbGJhY2s7OisIlQMSJkxhbmRyb2lkeC93b3JrL092ZXJ3cml0aW5nSW5wdXRNZXJnZXI7OjsIlgMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Zm8kenphOzo3CJcDEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emxsOzo3CJgDEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emtjOzo7CJkDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZvJHp6Yjs6OwiaAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmbyR6emQ7OjsImwMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Zm8kenpjOzo7CJwDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZvJHp6Zjs6OwidAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmbyR6emU7Oj8IngMSOkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenphJHp6YTs6PwifAxI6TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmciR6emEkenpjOzo/CKADEjpMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6YSR6emY7OjsIoQMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenphOzo7CKIDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6Yjs6OwijAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmciR6emM7OjsIpAMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenpkOzo7CKUDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6Zjs6OwimAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmciR6emk7OjsIpwMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenpnOzo7CKgDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6ZTs6OwipAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmciR6emg7OjsIqgMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnkkenphOzo7CKsDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6Yjs6OwisAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emM7OjsIrQMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnkkenpkOzo7CK4DEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6bTs6OwivAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emU7OjsIsAMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnkkenpmOzo7CLEDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6Zzs6OwiyAxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emg7OgYIswMSAUQ6Owi0AxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emk7OjsItQMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnkkenpqOzo7CLYDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6azs6Owi3AxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emw7OjcIuAMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6a2E7OjcIuQMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ano7OjsIugMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnkkenpuOzo7CLsDEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6bzs6Owi8AxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpnZCR6emE7OjsIvQMSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Z2QkenpiOzo7CL4DEjZMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emdkJHp6Yzs6Owi/AxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpnZCR6emQ7OjcIwAMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6aWI7OjcIwQMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6anQ7OjcIwgMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6bWo7OjkIwwMSNExjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvQW5kcm9pZEFwcGxpY2F0aW9uSW5mbzs6IQjEAxIcTGNvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyOzo3CMUDEjJMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0FuZHJvaWRNZW1vcnlSZWFkaW5nOzoyCMYDEi1MY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0FwcGxpY2F0aW9uSW5mbzs6JwjHAxIiTGNvbS9nb29nbGUvcHJvdG9idWYvTWFwRmllbGRMaXRlOzozCMgDEi5MY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0NwdU1ldHJpY1JlYWRpbmc7Oi4IyQMSKUxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvR2F1Z2VNZXRyaWM7OjAIygMSK0xjb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsJFByb3RvYnVmTGlzdDs6NwjLAxIyTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi92MS9OZXR3b3JrUmVxdWVzdE1ldHJpYzs6LQjMAxIoTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi92MS9QZXJmTWV0cmljOzouCM0DEilMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL1RyYWNlTWV0cmljOzowCM4DEitMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL1RyYW5zcG9ydEluZm87Oi4IzwMSKUxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvUGVyZlNlc3Npb247OisI0AMSJkxjb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsJEludExpc3Q7OjkI0QMSNExjb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsJExpc3RBZGFwdGVyJENvbnZlcnRlcjs6LgjSAxIpTGNvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZTs6NwjTAxIyTGNvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUkQnVpbGRlcjs6LwjUAxIqTGNvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGU7Oi4I1QMSKUxjb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldExpdGU7OkoI1gMSRUxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kYXRhc3RvcmUvVXNlclByZWZlcmVuY2VzOzouCNcDEilMYW5kcm9pZHgvYWN0aXZpdHkvcmVzdWx0L0FjdGl2aXR5UmVzdWx0OzozCNgDEi5MYW5kcm9pZHgvYWN0aXZpdHkvcmVzdWx0L0ludGVudFNlbmRlclJlcXVlc3Q7OjwI2QMSN0xhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFNwaW5uZXIkU2F2ZWRTdGF0ZTs6MwjaAxIuTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvVG9vbGJhciRTYXZlZFN0YXRlOzo9CNsDEjhMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xhenkvbGF5b3V0L0RlZmF1bHRMYXp5S2V5OzpDCNwDEj5MYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1BhcmNlbGFibGVTbmFwc2hvdE11dGFibGVGbG9hdFN0YXRlOzpBCN0DEjxMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1BhcmNlbGFibGVTbmFwc2hvdE11dGFibGVJbnRTdGF0ZTs6QgjeAxI9TGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9QYXJjZWxhYmxlU25hcHNob3RNdXRhYmxlTG9uZ1N0YXRlOzo+CN8DEjlMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1BhcmNlbGFibGVTbmFwc2hvdE11dGFibGVTdGF0ZTs6OwjgAxI2TGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9zbmFwc2hvdHMvU25hcHNob3RTdGF0ZUxpc3Q7OjcI4QMSMkxhbmRyb2lkeC9jb3JlL3dpZGdldC9OZXN0ZWRTY3JvbGxWaWV3JFNhdmVkU3RhdGU7Oi0I4gMSKExhbmRyb2lkeC9jdXN0b212aWV3L3ZpZXcvQWJzU2F2ZWRTdGF0ZTs6MQjjAxIsTGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9CYWNrU3RhY2tSZWNvcmRTdGF0ZTs6KwjkAxImTGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9CYWNrU3RhY2tTdGF0ZTs6QQjlAxI8TGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9GcmFnbWVudE1hbmFnZXIkTGF1bmNoZWRGcmFnbWVudEluZm87OjEI5gMSLExhbmRyb2lkeC9mcmFnbWVudC9hcHAvRnJhZ21lbnRNYW5hZ2VyU3RhdGU7OioI5wMSJUxhbmRyb2lkeC9mcmFnbWVudC9hcHAvRnJhZ21lbnRTdGF0ZTs6IgjoAxIdTGNvaWwvbWVtb3J5L01lbW9yeUNhY2hlJEtleTs6QQjpAxI8TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvYXV0aC9hcGkvc2lnbmluL0dvb2dsZVNpZ25JbkFjY291bnQ7OjkI6gMSNExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2Nsb3VkbWVzc2FnaW5nL0Nsb3VkTWVzc2FnZTs6MAjrAxIrTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY2xvdWRtZXNzYWdpbmcvenpkOzo1COwDEjBMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9jb21tb24vQ29ubmVjdGlvblJlc3VsdDs6LAjtAxInTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL0ZlYXR1cmU7Oi4I7gMSKUxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9hcGkvU2NvcGU7Oi8I7wMSKkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9hcGkvU3RhdHVzOzpOCPADEklMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9jb21tb24vaW50ZXJuYWwvQ29ubmVjdGlvblRlbGVtZXRyeUNvbmZpZ3VyYXRpb247Oj8I8QMSOkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC9HZXRTZXJ2aWNlUmVxdWVzdDs6PgjyAxI5TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2ludGVybmFsL01ldGhvZEludm9jYXRpb247OkgI8wMSQ0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC9Sb290VGVsZW1ldHJ5Q29uZmlndXJhdGlvbjs6Owj0AxI2TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL2ludGVybmFsL1RlbGVtZXRyeURhdGE7OjEI9QMSLExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC96YXQ7OjEI9gMSLExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC96YXY7OjEI9wMSLExjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9pbnRlcm5hbC96ems7OigI+AMSI0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi96em87OigI+QMSI0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi96enE7OigI+gMSI0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi96enM7OjcI+wMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL29zc19saWNlbnNlcy96emU7OjcI/AMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6YWU7OjcI/QMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6YWo7OjcI/gMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6YmU7OjcI/wMSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6YmY7OjcIgAQSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6bm87OjYIgQQSMUxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6bzs6NwiCBBIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenpvbjs6MQiDBBIsTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvc2lnbmluL2ludGVybmFsL3phYTs6MQiEBBIsTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvc2lnbmluL2ludGVybmFsL3phZzs6MQiFBBIsTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvc2lnbmluL2ludGVybmFsL3phaTs6MQiGBBIsTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvc2lnbmluL2ludGVybmFsL3phazs6MgiHBBItTGNvbS9nb29nbGUvZmlyZWJhc2UvbWVzc2FnaW5nL1JlbW90ZU1lc3NhZ2U7Oi8IiAQSKkxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvbWV0cmljcy9Db3VudGVyOzpBCIkEEjxMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9sYXllci92aWV3L1ZpZXdMYXllckNvbnRhaW5lcjs6NgiKBBIxTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQW5kcm9pZENvbXBvc2VWaWV3Ozo7CIsEEjZMYW5kcm9pZHgvbGlmZWN5Y2xlL1JlcG9ydEZyYWdtZW50JExpZmVjeWNsZUNhbGxiYWNrczs6RQiMBBJATGFuZHJvaWR4L2xpZmVjeWNsZS9SZXBvcnRGcmFnbWVudCRMaWZlY3ljbGVDYWxsYmFja3MkQ29tcGFuaW9uOzopCI0EEiRMYW5kcm9pZHgvdHJhbnNpdGlvbi9DaGFuZ2VCb3VuZHMkNjs6MgiOBBItTGFuZHJvaWR4L3RyYW5zaXRpb24vQ2hhbmdlQm91bmRzJFZpZXdCb3VuZHM7Ok8IjwQSSkxhbmRyb2lkeC92ZWN0b3JkcmF3YWJsZS9ncmFwaGljcy9kcmF3YWJsZS9WZWN0b3JEcmF3YWJsZUNvbXBhdCRWRnVsbFBhdGg7OkwIkAQSR0xhbmRyb2lkeC92ZWN0b3JkcmF3YWJsZS9ncmFwaGljcy9kcmF3YWJsZS9WZWN0b3JEcmF3YWJsZUNvbXBhdCRWR3JvdXA7Oh4IkQQSGUxhbmRyb2lkL2dyYXBoaWNzL01hdHJpeDs6SwiSBBJGTGFuZHJvaWR4L3ZlY3RvcmRyYXdhYmxlL2dyYXBoaWNzL2RyYXdhYmxlL1ZlY3RvckRyYXdhYmxlQ29tcGF0JFZQYXRoOzo2CJMEEjFbTGFuZHJvaWR4L2NvcmUvZ3JhcGhpY3MvUGF0aFBhcnNlciRQYXRoRGF0YU5vZGU7OlMIlAQSTkxhbmRyb2lkeC92ZWN0b3JkcmF3YWJsZS9ncmFwaGljcy9kcmF3YWJsZS9WZWN0b3JEcmF3YWJsZUNvbXBhdCRWUGF0aFJlbmRlcmVyOzpfCJUEElpMYW5kcm9pZHgvdmVjdG9yZHJhd2FibGUvZ3JhcGhpY3MvZHJhd2FibGUvVmVjdG9yRHJhd2FibGVDb21wYXQkVmVjdG9yRHJhd2FibGVDb21wYXRTdGF0ZTs6YQiWBBJcTGFuZHJvaWR4L3ZlY3RvcmRyYXdhYmxlL2dyYXBoaWNzL2RyYXdhYmxlL1ZlY3RvckRyYXdhYmxlQ29tcGF0JFZlY3RvckRyYXdhYmxlRGVsZWdhdGVTdGF0ZTs6KQiXBBIkTGtvdGxpbi9jb3JvdXRpbmVzL1NhZmVDb250aW51YXRpb247Oi8ImAQSKkxrb3RsaW54L2Nvcm91dGluZXMvQXdhaXRBbGwkQXdhaXRBbGxOb2RlOzoiCJkEEh1Ma290bGlueC9jb3JvdXRpbmVzL0F3YWl0QWxsOzo1CJoEEjBMa290bGlueC9jb3JvdXRpbmVzL0NhbmNlbGxhYmxlQ29udGludWF0aW9uSW1wbDs6LwibBBIqTGtvdGxpbngvY29yb3V0aW5lcy9DYW5jZWxsZWRDb250aW51YXRpb247OjAInAQSK0xrb3RsaW54L2Nvcm91dGluZXMvQ29tcGxldGVkRXhjZXB0aW9uYWxseTs6KQidBBIkTGtvdGxpbngvY29yb3V0aW5lcy9EZWZhdWx0RXhlY3V0b3I7OhcIngQSEkxqYXZhL2xhbmcvVGhyZWFkOzotCJ8EEihMa290bGlueC9jb3JvdXRpbmVzL0Rpc3BhdGNoZWRDb3JvdXRpbmU7OjcIoAQSMkxrb3RsaW54L2Nvcm91dGluZXMvRXZlbnRMb29wSW1wbEJhc2UkRGVsYXllZFRhc2s7OisIoQQSJkxrb3RsaW54L2Nvcm91dGluZXMvRXZlbnRMb29wSW1wbEJhc2U7OiwIogQSJ0xrb3RsaW54L2Nvcm91dGluZXMvSW52b2tlT25DYW5jZWxsaW5nOzouCKMEEilMa290bGlueC9jb3JvdXRpbmVzL0pvYlN1cHBvcnQkRmluaXNoaW5nOzokCKQEEh9Ma290bGlueC9jb3JvdXRpbmVzL0pvYlN1cHBvcnQ7OiUIpQQSIExrb3RsaW54L2Nvcm91dGluZXMvVGhyZWFkU3RhdGU7Oi8IpgQSKkxrb3RsaW54L2Nvcm91dGluZXMvVW5kaXNwYXRjaGVkQ29yb3V0aW5lOzo8CKcEEjdMa290bGlueC9jb3JvdXRpbmVzL2FuZHJvaWQvQW5kcm9pZEV4Y2VwdGlvblByZUhhbmRsZXI7OjUIqAQSMExrb3RsaW54L2Nvcm91dGluZXMvYW5kcm9pZC9IYW5kbGVyRGlzcGF0Y2hlckt0OzohCKkEEhxMYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXI7OjIIqgQSLUxrb3RsaW54L2Nvcm91dGluZXMvY2hhbm5lbHMvQnVmZmVyZWRDaGFubmVsOzosCKsEEidMa290bGlueC9jb3JvdXRpbmVzL2Zsb3cvU3RhdGVGbG93SW1wbDs6OwisBBI2TGtvdGxpbngvY29yb3V0aW5lcy9pbnRlcm5hbC9Db25jdXJyZW50TGlua2VkTGlzdE5vZGU7OjkIrQQSNExrb3RsaW54L2Nvcm91dGluZXMvaW50ZXJuYWwvRGlzcGF0Y2hlZENvbnRpbnVhdGlvbjs6NAiuBBIvTGtvdGxpbngvY29yb3V0aW5lcy9pbnRlcm5hbC9MaW1pdGVkRGlzcGF0Y2hlcjs6OQivBBI0TGtvdGxpbngvY29yb3V0aW5lcy9pbnRlcm5hbC9Mb2NrRnJlZUxpbmtlZExpc3ROb2RlOzo0CLAEEi9Ma290bGlueC9jb3JvdXRpbmVzL2ludGVybmFsL0xvY2tGcmVlVGFza1F1ZXVlOzo4CLEEEjNMa290bGlueC9jb3JvdXRpbmVzL2ludGVybmFsL0xvY2tGcmVlVGFza1F1ZXVlQ29yZTs6NwiyBBIyTGtvdGxpbngvY29yb3V0aW5lcy9pbnRlcm5hbC9SZXNpemFibGVBdG9taWNBcnJheTs6NwizBBIyTGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VBcnJheTs6Kgi0BBIlTGtvdGxpbngvY29yb3V0aW5lcy9pbnRlcm5hbC9TZWdtZW50OzoxCLUEEixMa290bGlueC9jb3JvdXRpbmVzL2ludGVybmFsL1RocmVhZFNhZmVIZWFwOzo+CLYEEjlMa290bGlueC9jb3JvdXRpbmVzL3NjaGVkdWxpbmcvQ29yb3V0aW5lU2NoZWR1bGVyJFdvcmtlcjs6Nwi3BBIyTGtvdGxpbngvY29yb3V0aW5lcy9zY2hlZHVsaW5nL0Nvcm91dGluZVNjaGVkdWxlcjs6Lgi4BBIpTGtvdGxpbngvY29yb3V0aW5lcy9zY2hlZHVsaW5nL1dvcmtRdWV1ZTs6KAi5BBIjTGtvdGxpbngvY29yb3V0aW5lcy9zeW5jL011dGV4SW1wbDs6NAi6BBIvTGtvdGxpbngvY29yb3V0aW5lcy9zeW5jL1NlbWFwaG9yZUFuZE11dGV4SW1wbDs6MAi7BBIrTGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL0VudGVyRXhpdFN0YXRlOzoxCLwEEixbTGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL0VudGVyRXhpdFN0YXRlOzo5CL0EEjRMYW5kcm9pZHgvY29tcG9zZS9hbmltYXRpb24vY29yZS9BbmltYXRpb25FbmRSZWFzb247OjoIvgQSNVtMYW5kcm9pZHgvY29tcG9zZS9hbmltYXRpb24vY29yZS9BbmltYXRpb25FbmRSZWFzb247OjUIvwQSMExhbmRyb2lkeC9jb21wb3NlL2FuaW1hdGlvbi9jb3JlL011dGF0ZVByaW9yaXR5Ozo2CMAEEjFbTGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL2NvcmUvTXV0YXRlUHJpb3JpdHk7OjEIwQQSLExhbmRyb2lkeC9jb21wb3NlL2FuaW1hdGlvbi9jb3JlL1JlcGVhdE1vZGU7OjIIwgQSLVtMYW5kcm9pZHgvY29tcG9zZS9hbmltYXRpb24vY29yZS9SZXBlYXRNb2RlOzoxCMMEEixMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL011dGF0ZVByaW9yaXR5OzoyCMQEEi1bTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9NdXRhdGVQcmlvcml0eTs6VwjFBBJSTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9nZXN0dXJlcy9EcmFnRGV0ZWN0aW9uU3RhdGUkQXdhaXREb3duJEF3YWl0VG91Y2hTbG9wOzpYCMYEElNbTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9nZXN0dXJlcy9EcmFnRGV0ZWN0aW9uU3RhdGUkQXdhaXREb3duJEF3YWl0VG91Y2hTbG9wOzp9CMcEEnhMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2dlc3R1cmVzL0luZGlyZWN0UG9pbnRlcklucHV0RHJhZ0N5Y2xlRGV0ZWN0b3IkRHJhZ0RldGVjdGlvblN0YXRlJEF3YWl0RG93biRBd2FpdFRvdWNoU2xvcDs6fgjIBBJ5W0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vZ2VzdHVyZXMvSW5kaXJlY3RQb2ludGVySW5wdXREcmFnQ3ljbGVEZXRlY3RvciREcmFnRGV0ZWN0aW9uU3RhdGUkQXdhaXREb3duJEF3YWl0VG91Y2hTbG9wOzo3CMkEEjJMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2dlc3R1cmVzL09yaWVudGF0aW9uOzo4CMoEEjNbTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9nZXN0dXJlcy9PcmllbnRhdGlvbjs6MwjLBBIuTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvRGlyZWN0aW9uOzo0CMwEEi9bTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvRGlyZWN0aW9uOzpJCM0EEkRMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2xheW91dC9GbG93TGF5b3V0T3ZlcmZsb3ckT3ZlcmZsb3dUeXBlOzpKCM4EEkVbTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvRmxvd0xheW91dE92ZXJmbG93JE92ZXJmbG93VHlwZTs6NwjPBBIyTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvSW50cmluc2ljU2l6ZTs6OAjQBBIzW0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L0ludHJpbnNpY1NpemU7OjsI0QQSNkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L0xheW91dE9yaWVudGF0aW9uOzo8CNIEEjdbTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi9sYXlvdXQvTGF5b3V0T3JpZW50YXRpb247Oi4I0wQSKUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9IYW5kbGU7Oi8I1AQSKltMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvSGFuZGxlOzozCNUEEi5MYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvSGFuZGxlU3RhdGU7OjQI1gQSL1tMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvSGFuZGxlU3RhdGU7OjII1wQSLUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9LZXlDb21tYW5kOzozCNgEEi5bTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi90ZXh0L0tleUNvbW1hbmQ7OjwI2QQSN0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9UZXh0Q29udGV4dE1lbnVJdGVtczs6PQjaBBI4W0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9UZXh0Q29udGV4dE1lbnVJdGVtczs6UAjbBBJLTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi90ZXh0L2NvbnRleHRtZW51L21vZGlmaWVyL1Rvb2xiYXJIYW5kbGVyU3RhdGU7OlEI3AQSTFtMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvY29udGV4dG1lbnUvbW9kaWZpZXIvVG9vbGJhckhhbmRsZXJTdGF0ZTs6PQjdBBI4TGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi90ZXh0L3NlbGVjdGlvbi9Dcm9zc1N0YXR1czs6PgjeBBI5W0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9zZWxlY3Rpb24vQ3Jvc3NTdGF0dXM7OkAI3wQSO0xhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9zZWxlY3Rpb24vRG93blJlc29sdXRpb247OkEI4AQSPFtMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvc2VsZWN0aW9uL0Rvd25SZXNvbHV0aW9uOzpCCOEEEj1MYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvc2VsZWN0aW9uL1NlbGVjdGVkVGV4dFR5cGU7OkMI4gQSPltMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL3RleHQvc2VsZWN0aW9uL1NlbGVjdGVkVGV4dFR5cGU7OkcI4wQSQkxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vdGV4dC9zZWxlY3Rpb24vU2VsZWN0aW9uSGFuZGxlQW5jaG9yOzpICOQEEkNbTGFuZHJvaWR4L2NvbXBvc2UvZm91bmRhdGlvbi90ZXh0L3NlbGVjdGlvbi9TZWxlY3Rpb25IYW5kbGVBbmNob3I7OjcI5QQSMkxhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9TY2FmZm9sZExheW91dENvbnRlbnQ7OjgI5gQSM1tMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvU2NhZmZvbGRMYXlvdXRDb250ZW50OzoyCOcEEi1MYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvU25hY2tiYXJEdXJhdGlvbjs6MwjoBBIuW0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9TbmFja2JhckR1cmF0aW9uOzowCOkEEitMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvU25hY2tiYXJSZXN1bHQ7OjEI6gQSLFtMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvU25hY2tiYXJSZXN1bHQ7OjkI6wQSNExhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9XaWRlTmF2aWdhdGlvblJhaWxWYWx1ZTs6OgjsBBI1W0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9XaWRlTmF2aWdhdGlvblJhaWxWYWx1ZTs6PAjtBBI3TGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9Eb2NrZWRFZGdlOzo9CO4EEjhbTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9Eb2NrZWRFZGdlOzpJCO8EEkRMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvYWRhcHRpdmUvbGF5b3V0L0RyYWdUb1Jlc2l6ZVN0YXRlJFN0YXRlOzpKCPAEEkVbTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9EcmFnVG9SZXNpemVTdGF0ZSRTdGF0ZTs6RwjxBBJCTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL2xheW91dC9UaHJlZVBhbmVTY2FmZm9sZFJvbGU7OkgI8gQSQ1tMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvYWRhcHRpdmUvbGF5b3V0L1RocmVlUGFuZVNjYWZmb2xkUm9sZTs6VwjzBBJSTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL25hdmlnYXRpb25zdWl0ZS9OYXZpZ2F0aW9uU3VpdGVTY2FmZm9sZFZhbHVlOzpYCPQEElNbTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL2FkYXB0aXZlL25hdmlnYXRpb25zdWl0ZS9OYXZpZ2F0aW9uU3VpdGVTY2FmZm9sZFZhbHVlOzo1CPUEEjBMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvaW50ZXJuYWwvSW5wdXRQaGFzZTs6Ngj2BBIxW0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9pbnRlcm5hbC9JbnB1dFBoYXNlOzo4CPcEEjNMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvaW50ZXJuYWwvVGV4dEZpZWxkVHlwZTs6OQj4BBI0W0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy9pbnRlcm5hbC9UZXh0RmllbGRUeXBlOzo9CPkEEjhMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvdG9rZW5zL0NvbG9yU2NoZW1lS2V5VG9rZW5zOzo+CPoEEjlbTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL3Rva2Vucy9Db2xvclNjaGVtZUtleVRva2Vuczs6Pgj7BBI5TGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL3Rva2Vucy9Nb3Rpb25TY2hlbWVLZXlUb2tlbnM7Oj8I/AQSOltMYW5kcm9pZHgvY29tcG9zZS9tYXRlcmlhbDMvdG9rZW5zL01vdGlvblNjaGVtZUtleVRva2Vuczs6Nwj9BBIyTGFuZHJvaWR4L2NvbXBvc2UvbWF0ZXJpYWwzL3Rva2Vucy9TaGFwZUtleVRva2Vuczs6OAj+BBIzW0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy90b2tlbnMvU2hhcGVLZXlUb2tlbnM7OjwI/wQSN0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy90b2tlbnMvVHlwb2dyYXBoeUtleVRva2Vuczs6PQiABRI4W0xhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsMy90b2tlbnMvVHlwb2dyYXBoeUtleVRva2Vuczs6MgiBBRItTGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9JbnZhbGlkYXRpb25SZXN1bHQ7OjMIggUSLltMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL0ludmFsaWRhdGlvblJlc3VsdDs6NgiDBRIxTGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9QYXVzZWRDb21wb3NpdGlvblN0YXRlOzo3CIQFEjJbTGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9QYXVzZWRDb21wb3NpdGlvblN0YXRlOzowCIUFEitMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1JlY29tcG9zZXIkU3RhdGU7OjEIhgUSLFtMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1JlY29tcG9zZXIkU3RhdGU7OjAIhwUSK0xhbmRyb2lkeC9jb21wb3NlL3VpL2F1dG9maWxsL0F1dG9maWxsVHlwZTs6MQiIBRIsW0xhbmRyb2lkeC9jb21wb3NlL3VpL2F1dG9maWxsL0F1dG9maWxsVHlwZTs6VgiJBRJRTGFuZHJvaWR4L2NvbXBvc2UvdWkvY29udGVudGNhcHR1cmUvQW5kcm9pZENvbnRlbnRDYXB0dXJlTWFuYWdlciRUcmFuc2xhdGVTdGF0dXM7OlcIigUSUltMYW5kcm9pZHgvY29tcG9zZS91aS9jb250ZW50Y2FwdHVyZS9BbmRyb2lkQ29udGVudENhcHR1cmVNYW5hZ2VyJFRyYW5zbGF0ZVN0YXR1czs6QQiLBRI8TGFuZHJvaWR4L2NvbXBvc2UvdWkvY29udGVudGNhcHR1cmUvQ29udGVudENhcHR1cmVFdmVudFR5cGU7OkIIjAUSPVtMYW5kcm9pZHgvY29tcG9zZS91aS9jb250ZW50Y2FwdHVyZS9Db250ZW50Q2FwdHVyZUV2ZW50VHlwZTs6OAiNBRIzTGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvQ3VzdG9tRGVzdGluYXRpb25SZXN1bHQ7OjkIjgUSNFtMYW5kcm9pZHgvY29tcG9zZS91aS9mb2N1cy9DdXN0b21EZXN0aW5hdGlvblJlc3VsdDs6LwiPBRIqTGFuZHJvaWR4L2NvbXBvc2UvdWkvZm9jdXMvRm9jdXNTdGF0ZUltcGw7OjAIkAUSK1tMYW5kcm9pZHgvY29tcG9zZS91aS9mb2N1cy9Gb2N1c1N0YXRlSW1wbDs6MgiRBRItTGFuZHJvaWR4L2NvbXBvc2UvdWkvZ3JhcGhpY3MvUGF0aCREaXJlY3Rpb247OjMIkgUSLltMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9QYXRoJERpcmVjdGlvbjs6OQiTBRI0TGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9Qb2ludGVyRXZlbnRQYXNzOzo6CJQFEjVbTGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9Qb2ludGVyRXZlbnRQYXNzOzpICJUFEkNMYW5kcm9pZHgvY29tcG9zZS91aS9pbnB1dC9wb2ludGVyL3V0aWwvVmVsb2NpdHlUcmFja2VyMUQkU3RyYXRlZ3k7OkkIlgUSRFtMYW5kcm9pZHgvY29tcG9zZS91aS9pbnB1dC9wb2ludGVyL3V0aWwvVmVsb2NpdHlUcmFja2VyMUQkU3RyYXRlZ3k7OjEIlwUSLExhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9JbnRyaW5zaWNNaW5NYXg7OjIImAUSLVtMYW5kcm9pZHgvY29tcG9zZS91aS9sYXlvdXQvSW50cmluc2ljTWluTWF4Ozo2CJkFEjFMYW5kcm9pZHgvY29tcG9zZS91aS9sYXlvdXQvSW50cmluc2ljV2lkdGhIZWlnaHQ7OjcImgUSMltMYW5kcm9pZHgvY29tcG9zZS91aS9sYXlvdXQvSW50cmluc2ljV2lkdGhIZWlnaHQ7OkUImwUSQExhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9NZWFzdXJpbmdJbnRyaW5zaWNzJEludHJpbnNpY01pbk1heDs6RgicBRJBW0xhbmRyb2lkeC9jb21wb3NlL3VpL2xheW91dC9NZWFzdXJpbmdJbnRyaW5zaWNzJEludHJpbnNpY01pbk1heDs6SgidBRJFTGFuZHJvaWR4L2NvbXBvc2UvdWkvbGF5b3V0L01lYXN1cmluZ0ludHJpbnNpY3MkSW50cmluc2ljV2lkdGhIZWlnaHQ7OksIngUSRltMYW5kcm9pZHgvY29tcG9zZS91aS9sYXlvdXQvTWVhc3VyaW5nSW50cmluc2ljcyRJbnRyaW5zaWNXaWR0aEhlaWdodDs6LAifBRInTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9JbnZhbGlkYXRpb247Oi0IoAUSKFtMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL0ludmFsaWRhdGlvbjs6NgihBRIxTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9MYXlvdXROb2RlJExheW91dFN0YXRlOzo3CKIFEjJbTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9MYXlvdXROb2RlJExheW91dFN0YXRlOzo4CKMFEjNMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL0xheW91dE5vZGUkVXNhZ2VCeVBhcmVudDs6OQikBRI0W0xhbmRyb2lkeC9jb21wb3NlL3VpL25vZGUvTGF5b3V0Tm9kZSRVc2FnZUJ5UGFyZW50OzpBCKUFEjxMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL0xvb2thaGVhZFBhc3NEZWxlZ2F0ZSRQbGFjZWRTdGF0ZTs6QgimBRI9W0xhbmRyb2lkeC9jb21wb3NlL3VpL25vZGUvTG9va2FoZWFkUGFzc0RlbGVnYXRlJFBsYWNlZFN0YXRlOzpHCKcFEkJMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL05vZGVNZWFzdXJpbmdJbnRyaW5zaWNzJEludHJpbnNpY01pbk1heDs6SAioBRJDW0xhbmRyb2lkeC9jb21wb3NlL3VpL25vZGUvTm9kZU1lYXN1cmluZ0ludHJpbnNpY3MkSW50cmluc2ljTWluTWF4OzpMCKkFEkdMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL05vZGVNZWFzdXJpbmdJbnRyaW5zaWNzJEludHJpbnNpY1dpZHRoSGVpZ2h0OzpNCKoFEkhbTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9Ob2RlTWVhc3VyaW5nSW50cmluc2ljcyRJbnRyaW5zaWNXaWR0aEhlaWdodDs6UwirBRJOTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9UcmF2ZXJzYWJsZU5vZGUkQ29tcGFuaW9uJFRyYXZlcnNlRGVzY2VuZGFudHNBY3Rpb247OlQIrAUST1tMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL1RyYXZlcnNhYmxlTm9kZSRDb21wYW5pb24kVHJhdmVyc2VEZXNjZW5kYW50c0FjdGlvbjs6NQitBRIwTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vVGV4dFRvb2xiYXJTdGF0dXM7OjYIrgUSMVtMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9UZXh0VG9vbGJhclN0YXR1czs6RQivBRJATGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vYWN0aW9ubW9kZWNhbGxiYWNrL01lbnVJdGVtT3B0aW9uOzpGCLAFEkFbTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vYWN0aW9ubW9kZWNhbGxiYWNrL01lbnVJdGVtT3B0aW9uOzowCLEFEitMYW5kcm9pZHgvY29tcG9zZS91aS9zdGF0ZS9Ub2dnbGVhYmxlU3RhdGU7OjEIsgUSLFtMYW5kcm9pZHgvY29tcG9zZS91aS9zdGF0ZS9Ub2dnbGVhYmxlU3RhdGU7Oi4IswUSKUxhbmRyb2lkeC9jb21wb3NlL3VpL3RleHQvQW5ub3RhdGlvblR5cGU7Oi8ItAUSKltMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L0Fubm90YXRpb25UeXBlOzpOCLUFEklMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L2lucHV0L1RleHRJbnB1dFNlcnZpY2VBbmRyb2lkJFRleHRJbnB1dENvbW1hbmQ7Ok8ItgUSSltMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L2lucHV0L1RleHRJbnB1dFNlcnZpY2VBbmRyb2lkJFRleHRJbnB1dENvbW1hbmQ7OjsItwUSNkxhbmRyb2lkeC9jb21wb3NlL3VpL3RleHQvc3R5bGUvUmVzb2x2ZWRUZXh0RGlyZWN0aW9uOzo8CLgFEjdbTGFuZHJvaWR4L2NvbXBvc2UvdWkvdGV4dC9zdHlsZS9SZXNvbHZlZFRleHREaXJlY3Rpb247Oi8IuQUSKkxhbmRyb2lkeC9jb21wb3NlL3VpL3VuaXQvTGF5b3V0RGlyZWN0aW9uOzowCLoFEitbTGFuZHJvaWR4L2NvbXBvc2UvdWkvdW5pdC9MYXlvdXREaXJlY3Rpb247OjIIuwUSLUxhbmRyb2lkeC9jb21wb3NlL3VpL3dpbmRvdy9TZWN1cmVGbGFnUG9saWN5OzozCLwFEi5bTGFuZHJvaWR4L2NvbXBvc2UvdWkvd2luZG93L1NlY3VyZUZsYWdQb2xpY3k7OjEIvQUSLExhbmRyb2lkeC9jb25jdXJyZW50L2Z1dHVyZXMvRGlyZWN0RXhlY3V0b3I7OjIIvgUSLVtMYW5kcm9pZHgvY29uY3VycmVudC9mdXR1cmVzL0RpcmVjdEV4ZWN1dG9yOzpGCL8FEkFMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VzUHJvdG8kVmFsdWUkVmFsdWVDYXNlOzpHCMAFEkJbTGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlc1Byb3RvJFZhbHVlJFZhbHVlQ2FzZTs6QwjBBRI+TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9GaWVsZFR5cGUkQ29sbGVjdGlvbjs6RAjCBRI/W0xhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvRmllbGRUeXBlJENvbGxlY3Rpb247OjgIwwUSM0xhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvRmllbGRUeXBlOzo5CMQFEjRbTGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9GaWVsZFR5cGU7OlIIxQUSTUxhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUkTWV0aG9kVG9JbnZva2U7OlMIxgUSTltMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlJE1ldGhvZFRvSW52b2tlOzo3CMcFEjJMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL0phdmFUeXBlOzo4CMgFEjNbTGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9KYXZhVHlwZTs6OgjJBRI1TGFuZHJvaWR4L2RhdGFzdG9yZS9wcmVmZXJlbmNlcy9wcm90b2J1Zi9Qcm90b1N5bnRheDs6OwjKBRI2W0xhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvUHJvdG9TeW50YXg7OkMIywUSPkxhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvV2lyZUZvcm1hdCRGaWVsZFR5cGU7OkQIzAUSP1tMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL1dpcmVGb3JtYXQkRmllbGRUeXBlOzpCCM0FEj1MYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL1dpcmVGb3JtYXQkSmF2YVR5cGU7OkMIzgUSPltMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL1dpcmVGb3JtYXQkSmF2YVR5cGU7OkAIzwUSO0xhbmRyb2lkeC9kYXRhc3RvcmUvcHJlZmVyZW5jZXMvcHJvdG9idWYvV3JpdGVyJEZpZWxkT3JkZXI7OkEI0AUSPFtMYW5kcm9pZHgvZGF0YXN0b3JlL3ByZWZlcmVuY2VzL3Byb3RvYnVmL1dyaXRlciRGaWVsZE9yZGVyOzpPCNEFEkpMYW5kcm9pZHgvZnJhZ21lbnQvYXBwL1NwZWNpYWxFZmZlY3RzQ29udHJvbGxlciRPcGVyYXRpb24kTGlmZWN5Y2xlSW1wYWN0OzpQCNIFEktbTGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9TcGVjaWFsRWZmZWN0c0NvbnRyb2xsZXIkT3BlcmF0aW9uJExpZmVjeWNsZUltcGFjdDs6RQjTBRJATGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9TcGVjaWFsRWZmZWN0c0NvbnRyb2xsZXIkT3BlcmF0aW9uJFN0YXRlOzpGCNQFEkFbTGFuZHJvaWR4L2ZyYWdtZW50L2FwcC9TcGVjaWFsRWZmZWN0c0NvbnRyb2xsZXIkT3BlcmF0aW9uJFN0YXRlOzo/CNUFEjpMYW5kcm9pZHgvZnJhZ21lbnQvYXBwL3N0cmljdG1vZGUvRnJhZ21lbnRTdHJpY3RNb2RlJEZsYWc7OkAI1gUSO1tMYW5kcm9pZHgvZnJhZ21lbnQvYXBwL3N0cmljdG1vZGUvRnJhZ21lbnRTdHJpY3RNb2RlJEZsYWc7OikI1wUSJExhbmRyb2lkeC9saWZlY3ljbGUvTGlmZWN5Y2xlJEV2ZW50OzoqCNgFEiVbTGFuZHJvaWR4L2xpZmVjeWNsZS9MaWZlY3ljbGUkRXZlbnQ7OikI2QUSJExhbmRyb2lkeC9saWZlY3ljbGUvTGlmZWN5Y2xlJFN0YXRlOzoqCNoFEiVbTGFuZHJvaWR4L2xpZmVjeWNsZS9MaWZlY3ljbGUkU3RhdGU7OjUI2wUSMExhbmRyb2lkeC9sb2FkZXIvY29udGVudC9Nb2Rlcm5Bc3luY1Rhc2skU3RhdHVzOzo2CNwFEjFbTGFuZHJvaWR4L2xvYWRlci9jb250ZW50L01vZGVybkFzeW5jVGFzayRTdGF0dXM7OjAI3QUSK0xhbmRyb2lkeC9wcm9maWxlaW5zdGFsbGVyL0ZpbGVTZWN0aW9uVHlwZTs6MQjeBRIsW0xhbmRyb2lkeC9wcm9maWxlaW5zdGFsbGVyL0ZpbGVTZWN0aW9uVHlwZTs6MgjfBRItTGFuZHJvaWR4L3Jvb20vT2JzZXJ2ZWRUYWJsZVN0YXRlcyRPYnNlcnZlT3A7OjMI4AUSLltMYW5kcm9pZHgvcm9vbS9PYnNlcnZlZFRhYmxlU3RhdGVzJE9ic2VydmVPcDs6LQjhBRIoTGFuZHJvaWR4L3Jvb20vUm9vbURhdGFiYXNlJEpvdXJuYWxNb2RlOzouCOIFEilbTGFuZHJvaWR4L3Jvb20vUm9vbURhdGFiYXNlJEpvdXJuYWxNb2RlOzo1COMFEjBMYW5kcm9pZHgvcm9vbS9UcmFuc2FjdG9yJFNRTGl0ZVRyYW5zYWN0aW9uVHlwZTs6NgjkBRIxW0xhbmRyb2lkeC9yb29tL1RyYW5zYWN0b3IkU1FMaXRlVHJhbnNhY3Rpb25UeXBlOzpVCOUFElBMYW5kcm9pZHgvc3FsaXRlL2RiL2ZyYW1ld29yay9GcmFtZXdvcmtTUUxpdGVPcGVuSGVscGVyJE9wZW5IZWxwZXIkQ2FsbGJhY2tOYW1lOzpWCOYFElFbTGFuZHJvaWR4L3NxbGl0ZS9kYi9mcmFtZXdvcmsvRnJhbWV3b3JrU1FMaXRlT3BlbkhlbHBlciRPcGVuSGVscGVyJENhbGxiYWNrTmFtZTs6UwjnBRJOTGFuZHJvaWR4L3NxbGl0ZS9kcml2ZXIvU3VwcG9ydFNRTGl0ZVN0YXRlbWVudCRDb21wYW5pb24kVHJhbnNhY3Rpb25PcGVyYXRpb247OlQI6AUST1tMYW5kcm9pZHgvc3FsaXRlL2RyaXZlci9TdXBwb3J0U1FMaXRlU3RhdGVtZW50JENvbXBhbmlvbiRUcmFuc2FjdGlvbk9wZXJhdGlvbjs6LAjpBRInTGFuZHJvaWR4L3dpbmRvdy9jb3JlL1ZlcmlmaWNhdGlvbk1vZGU7Oi0I6gUSKFtMYW5kcm9pZHgvd2luZG93L2NvcmUvVmVyaWZpY2F0aW9uTW9kZTs6IgjrBRIdTGFuZHJvaWR4L3dvcmsvQmFja29mZlBvbGljeTs6IwjsBRIeW0xhbmRyb2lkeC93b3JrL0JhY2tvZmZQb2xpY3k7OiMI7QUSHkxhbmRyb2lkeC93b3JrL0RpcmVjdEV4ZWN1dG9yOzokCO4FEh9bTGFuZHJvaWR4L3dvcmsvRGlyZWN0RXhlY3V0b3I7OicI7wUSIkxhbmRyb2lkeC93b3JrL0V4aXN0aW5nV29ya1BvbGljeTs6KAjwBRIjW0xhbmRyb2lkeC93b3JrL0V4aXN0aW5nV29ya1BvbGljeTs6IAjxBRIbTGFuZHJvaWR4L3dvcmsvTmV0d29ya1R5cGU7OiEI8gUSHFtMYW5kcm9pZHgvd29yay9OZXR3b3JrVHlwZTs6JQjzBRIgTGFuZHJvaWR4L3dvcmsvT3V0T2ZRdW90YVBvbGljeTs6Jgj0BRIhW0xhbmRyb2lkeC93b3JrL091dE9mUXVvdGFQb2xpY3k7OiMI9QUSHkxhbmRyb2lkeC93b3JrL1dvcmtJbmZvJFN0YXRlOzokCPYFEh9bTGFuZHJvaWR4L3dvcmsvV29ya0luZm8kU3RhdGU7Oh0I9wUSGExjb2lsL2RlY29kZS9EYXRhU291cmNlOzoeCPgFEhlbTGNvaWwvZGVjb2RlL0RhdGFTb3VyY2U7OigI+QUSI0xjb2lsL2RlY29kZS9FeGlmT3JpZW50YXRpb25Qb2xpY3k7OikI+gUSJFtMY29pbC9kZWNvZGUvRXhpZk9yaWVudGF0aW9uUG9saWN5OzofCPsFEhpMY29pbC9yZXF1ZXN0L0NhY2hlUG9saWN5OzogCPwFEhtbTGNvaWwvcmVxdWVzdC9DYWNoZVBvbGljeTs6Ggj9BRIVTGNvaWwvc2l6ZS9QcmVjaXNpb247OhsI/gUSFltMY29pbC9zaXplL1ByZWNpc2lvbjs6Fgj/BRIRTGNvaWwvc2l6ZS9TY2FsZTs6FwiABhISW0xjb2lsL3NpemUvU2NhbGU7OjAIgQYSK0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9Qcmlvcml0eTs6MQiCBhIsW0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9Qcmlvcml0eTs6SgiDBhJFTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L2NjdC9pbnRlcm5hbC9DbGllbnRJbmZvJENsaWVudFR5cGU7OksIhAYSRltMY29tL2dvb2dsZS9hbmRyb2lkL2RhdGF0cmFuc3BvcnQvY2N0L2ludGVybmFsL0NsaWVudEluZm8kQ2xpZW50VHlwZTs6UwiFBhJOTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L2NjdC9pbnRlcm5hbC9Db21wbGlhbmNlRGF0YSRQcm9kdWN0SWRPcmlnaW47OlQIhgYST1tMY29tL2dvb2dsZS9hbmRyb2lkL2RhdGF0cmFuc3BvcnQvY2N0L2ludGVybmFsL0NvbXBsaWFuY2VEYXRhJFByb2R1Y3RJZE9yaWdpbjs6WAiHBhJTTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L2NjdC9pbnRlcm5hbC9OZXR3b3JrQ29ubmVjdGlvbkluZm8kTW9iaWxlU3VidHlwZTs6WQiIBhJUW0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9jY3QvaW50ZXJuYWwvTmV0d29ya0Nvbm5lY3Rpb25JbmZvJE1vYmlsZVN1YnR5cGU7OlYIiQYSUUxjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9jY3QvaW50ZXJuYWwvTmV0d29ya0Nvbm5lY3Rpb25JbmZvJE5ldHdvcmtUeXBlOzpXCIoGElJbTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L2NjdC9pbnRlcm5hbC9OZXR3b3JrQ29ubmVjdGlvbkluZm8kTmV0d29ya1R5cGU7OjwIiwYSN0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9jY3QvaW50ZXJuYWwvUW9zVGllcjs6PQiMBhI4W0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9jY3QvaW50ZXJuYWwvUW9zVGllcjs6TwiNBhJKTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L3J1bnRpbWUvYmFja2VuZHMvQmFja2VuZFJlc3BvbnNlJFN0YXR1czs6UAiOBhJLW0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9ydW50aW1lL2JhY2tlbmRzL0JhY2tlbmRSZXNwb25zZSRTdGF0dXM7OlkIjwYSVExjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9ydW50aW1lL2ZpcmViYXNlL3RyYW5zcG9ydC9Mb2dFdmVudERyb3BwZWQkUmVhc29uOzpaCJAGElVbTGNvbS9nb29nbGUvYW5kcm9pZC9kYXRhdHJhbnNwb3J0L3J1bnRpbWUvZmlyZWJhc2UvdHJhbnNwb3J0L0xvZ0V2ZW50RHJvcHBlZCRSZWFzb247Ol0IkQYSWExjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9ydW50aW1lL3NjaGVkdWxpbmcvam9ic2NoZWR1bGluZy9TY2hlZHVsZXJDb25maWckRmxhZzs6XgiSBhJZW0xjb20vZ29vZ2xlL2FuZHJvaWQvZGF0YXRyYW5zcG9ydC9ydW50aW1lL3NjaGVkdWxpbmcvam9ic2NoZWR1bGluZy9TY2hlZHVsZXJDb25maWckRmxhZzs6NwiTBhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpidjs6OAiUBhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6YnY7OjcIlQYSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Y2o7OjgIlgYSM1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emNqOzo3CJcGEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emNuOzo4CJgGEjNbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpjbjs6NwiZBhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpjbzs6OAiaBhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Y287Oj8ImwYSOkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Zm8kenpkJHp6Yjs6QAicBhI7W0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Zm8kenpkJHp6Yjs6PwidBhI6TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmbyR6emYkenpiOzpACJ4GEjtbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmbyR6emYkenpiOzo/CJ8GEjpMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6YSR6emQ7OkAIoAYSO1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZyJHp6YSR6emQ7Oj8IoQYSOkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenphJHp6ZTs6QAiiBhI7W0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6ZnIkenphJHp6ZTs6PwijBhI6TGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emokenpiOzpACKQGEjtbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpmeSR6emokenpiOzo/CKUGEjpMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6bCR6emI7OkAIpgYSO1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emZ5JHp6bCR6emI7OjcIpwYSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6Z2E7OjgIqAYSM1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emdhOzo/CKkGEjpMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emdkJHp6ZCR6emE7OkAIqgYSO1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emdkJHp6ZCR6emE7OjcIqwYSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6am47OjgIrAYSM1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96empuOzo3CK0GEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96empwOzo4CK4GEjNbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenpqcDs6NwivBhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenprZDs6OAiwBhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6a2Q7OjcIsQYSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6bG47OjgIsgYSM1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96emxuOzo3CLMGEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9pbnRlcm5hbC9tZWFzdXJlbWVudC96em1zOzo4CLQGEjNbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenptczs6Nwi1BhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvaW50ZXJuYWwvbWVhc3VyZW1lbnQvenptejs6OAi2BhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6bXo7OjYItwYSMUxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6czs6Nwi4BhIyW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2ludGVybmFsL21lYXN1cmVtZW50L3p6czs6Nwi5BhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenphazs6OAi6BhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6YWs7OjsIuwYSNkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6amUkenphOzo8CLwGEjdbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenpqZSR6emE7OjcIvQYSMkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6amc7OjgIvgYSM1tMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9tZWFzdXJlbWVudC9pbnRlcm5hbC96empnOzo3CL8GEjJMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9tZWFzdXJlbWVudC9pbnRlcm5hbC96empoOzo4CMAGEjNbTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenpqaDs6NwjBBhIyTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvbWVhc3VyZW1lbnQvaW50ZXJuYWwvenpudDs6OAjCBhIzW0xjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL21lYXN1cmVtZW50L2ludGVybmFsL3p6bnQ7OjcIwwYSMkxjb20vZ29vZ2xlL2NvbW1vbi9jb2xsZWN0L0Fic3RyYWN0SXRlcmF0b3IkU3RhdGU7OjgIxAYSM1tMY29tL2dvb2dsZS9jb21tb24vY29sbGVjdC9BYnN0cmFjdEl0ZXJhdG9yJFN0YXRlOzozCMUGEi5MY29tL2dvb2dsZS9jb21tb24vY29sbGVjdC9NYXBzJEVudHJ5RnVuY3Rpb247OjQIxgYSL1tMY29tL2dvb2dsZS9jb21tb24vY29sbGVjdC9NYXBzJEVudHJ5RnVuY3Rpb247OjcIxwYSMkxjb20vZ29vZ2xlL2NvbW1vbi91dGlsL2NvbmN1cnJlbnQvRGlyZWN0RXhlY3V0b3I7OjgIyAYSM1tMY29tL2dvb2dsZS9jb21tb24vdXRpbC9jb25jdXJyZW50L0RpcmVjdEV4ZWN1dG9yOzpGCMkGEkFMY29tL2dvb2dsZS9maXJlYmFzZS9jb25jdXJyZW50L0ZpcmViYXNlRXhlY3V0b3JzJERpcmVjdEV4ZWN1dG9yOzpHCMoGEkJbTGNvbS9nb29nbGUvZmlyZWJhc2UvY29uY3VycmVudC9GaXJlYmFzZUV4ZWN1dG9ycyREaXJlY3RFeGVjdXRvcjs6SwjLBhJGTGNvbS9nb29nbGUvZmlyZWJhc2UvY29uY3VycmVudC9TZXF1ZW50aWFsRXhlY3V0b3IkV29ya2VyUnVubmluZ1N0YXRlOzpMCMwGEkdbTGNvbS9nb29nbGUvZmlyZWJhc2UvY29uY3VycmVudC9TZXF1ZW50aWFsRXhlY3V0b3IkV29ya2VyUnVubmluZ1N0YXRlOzowCM0GEitMY29tL2dvb2dsZS9maXJlYmFzZS9jb25jdXJyZW50L1VpRXhlY3V0b3I7OjEIzgYSLFtMY29tL2dvb2dsZS9maXJlYmFzZS9jb25jdXJyZW50L1VpRXhlY3V0b3I7Ok8IzwYSSkxjb20vZ29vZ2xlL2ZpcmViYXNlL2NyYXNobHl0aWNzL2ludGVybmFsL2NvbW1vbi9Db21tb25VdGlscyRBcmNoaXRlY3R1cmU7OlAI0AYSS1tMY29tL2dvb2dsZS9maXJlYmFzZS9jcmFzaGx5dGljcy9pbnRlcm5hbC9jb21tb24vQ29tbW9uVXRpbHMkQXJjaGl0ZWN0dXJlOzpICNEGEkNMY29tL2dvb2dsZS9maXJlYmFzZS9jcmFzaGx5dGljcy9pbnRlcm5hbC9jb21tb24vRGVsaXZlcnlNZWNoYW5pc207OkkI0gYSRFtMY29tL2dvb2dsZS9maXJlYmFzZS9jcmFzaGx5dGljcy9pbnRlcm5hbC9jb21tb24vRGVsaXZlcnlNZWNoYW5pc207Ok4I0wYSSUxjb20vZ29vZ2xlL2ZpcmViYXNlL2NyYXNobHl0aWNzL2ludGVybmFsL3NldHRpbmdzL1NldHRpbmdzQ2FjaGVCZWhhdmlvcjs6TwjUBhJKW0xjb20vZ29vZ2xlL2ZpcmViYXNlL2NyYXNobHl0aWNzL2ludGVybmFsL3NldHRpbmdzL1NldHRpbmdzQ2FjaGVCZWhhdmlvcjs6PgjVBhI5TGNvbS9nb29nbGUvZmlyZWJhc2UvZW5jb2RlcnMvcHJvdG8vUHJvdG9idWYkSW50RW5jb2Rpbmc7Oj8I1gYSOltMY29tL2dvb2dsZS9maXJlYmFzZS9lbmNvZGVycy9wcm90by9Qcm90b2J1ZiRJbnRFbmNvZGluZzs6QAjXBhI7TGNvbS9nb29nbGUvZmlyZWJhc2UvaGVhcnRiZWF0aW5mby9IZWFydEJlYXRJbmZvJEhlYXJ0QmVhdDs6QQjYBhI8W0xjb20vZ29vZ2xlL2ZpcmViYXNlL2hlYXJ0YmVhdGluZm8vSGVhcnRCZWF0SW5mbyRIZWFydEJlYXQ7Ok4I2QYSSUxjb20vZ29vZ2xlL2ZpcmViYXNlL2luc3RhbGxhdGlvbnMvRmlyZWJhc2VJbnN0YWxsYXRpb25zRXhjZXB0aW9uJFN0YXR1czs6TwjaBhJKW0xjb20vZ29vZ2xlL2ZpcmViYXNlL2luc3RhbGxhdGlvbnMvRmlyZWJhc2VJbnN0YWxsYXRpb25zRXhjZXB0aW9uJFN0YXR1czs6VwjbBhJSTGNvbS9nb29nbGUvZmlyZWJhc2UvaW5zdGFsbGF0aW9ucy9sb2NhbC9QZXJzaXN0ZWRJbnN0YWxsYXRpb24kUmVnaXN0cmF0aW9uU3RhdHVzOzpYCNwGElNbTGNvbS9nb29nbGUvZmlyZWJhc2UvaW5zdGFsbGF0aW9ucy9sb2NhbC9QZXJzaXN0ZWRJbnN0YWxsYXRpb24kUmVnaXN0cmF0aW9uU3RhdHVzOzpRCN0GEkxMY29tL2dvb2dsZS9maXJlYmFzZS9pbnN0YWxsYXRpb25zL3JlbW90ZS9JbnN0YWxsYXRpb25SZXNwb25zZSRSZXNwb25zZUNvZGU7OlII3gYSTVtMY29tL2dvb2dsZS9maXJlYmFzZS9pbnN0YWxsYXRpb25zL3JlbW90ZS9JbnN0YWxsYXRpb25SZXNwb25zZSRSZXNwb25zZUNvZGU7OkgI3wYSQ0xjb20vZ29vZ2xlL2ZpcmViYXNlL2luc3RhbGxhdGlvbnMvcmVtb3RlL1Rva2VuUmVzdWx0JFJlc3BvbnNlQ29kZTs6SQjgBhJEW0xjb20vZ29vZ2xlL2ZpcmViYXNlL2luc3RhbGxhdGlvbnMvcmVtb3RlL1Rva2VuUmVzdWx0JFJlc3BvbnNlQ29kZTs6SQjhBhJETGNvbS9nb29nbGUvZmlyZWJhc2UvbWVzc2FnaW5nL3JlcG9ydGluZy9NZXNzYWdpbmdDbGllbnRFdmVudCRFdmVudDs6SgjiBhJFW0xjb20vZ29vZ2xlL2ZpcmViYXNlL21lc3NhZ2luZy9yZXBvcnRpbmcvTWVzc2FnaW5nQ2xpZW50RXZlbnQkRXZlbnQ7Ok8I4wYSSkxjb20vZ29vZ2xlL2ZpcmViYXNlL21lc3NhZ2luZy9yZXBvcnRpbmcvTWVzc2FnaW5nQ2xpZW50RXZlbnQkTWVzc2FnZVR5cGU7OlAI5AYSS1tMY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvcmVwb3J0aW5nL01lc3NhZ2luZ0NsaWVudEV2ZW50JE1lc3NhZ2VUeXBlOzpPCOUGEkpMY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvcmVwb3J0aW5nL01lc3NhZ2luZ0NsaWVudEV2ZW50JFNES1BsYXRmb3JtOzpQCOYGEktbTGNvbS9nb29nbGUvZmlyZWJhc2UvbWVzc2FnaW5nL3JlcG9ydGluZy9NZXNzYWdpbmdDbGllbnRFdmVudCRTREtQbGF0Zm9ybTs6OwjnBhI2TGNvbS9nb29nbGUvZmlyZWJhc2UvbWVzc2FnaW5nL3RocmVhZHMvVGhyZWFkUHJpb3JpdHk7OjwI6AYSN1tMY29tL2dvb2dsZS9maXJlYmFzZS9tZXNzYWdpbmcvdGhyZWFkcy9UaHJlYWRQcmlvcml0eTs6OwjpBhI2TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi91dGlsL0NvbnN0YW50cyRDb3VudGVyTmFtZXM7OjwI6gYSN1tMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3V0aWwvQ29uc3RhbnRzJENvdW50ZXJOYW1lczs6OQjrBhI0TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi91dGlsL0NvbnN0YW50cyRUcmFjZU5hbWVzOzo6COwGEjVbTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi91dGlsL0NvbnN0YW50cyRUcmFjZU5hbWVzOzowCO0GEitMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3V0aWwvU3RvcmFnZVVuaXQ7OjEI7gYSLFtMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3V0aWwvU3RvcmFnZVVuaXQ7OjsI7wYSNltMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL0FwcGxpY2F0aW9uUHJvY2Vzc1N0YXRlOzpCCPAGEj1MY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL05ldHdvcmtSZXF1ZXN0TWV0cmljJEh0dHBNZXRob2Q7OkMI8QYSPltMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL05ldHdvcmtSZXF1ZXN0TWV0cmljJEh0dHBNZXRob2Q7OlAI8gYSS0xjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvTmV0d29ya1JlcXVlc3RNZXRyaWMkTmV0d29ya0NsaWVudEVycm9yUmVhc29uOzpRCPMGEkxbTGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi92MS9OZXR3b3JrUmVxdWVzdE1ldHJpYyROZXR3b3JrQ2xpZW50RXJyb3JSZWFzb247OjMI9AYSLkxjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvU2Vzc2lvblZlcmJvc2l0eTs6NAj1BhIvW0xjb20vZ29vZ2xlL2ZpcmViYXNlL3BlcmYvdjEvU2Vzc2lvblZlcmJvc2l0eTs6RAj2BhI/TGNvbS9nb29nbGUvZmlyZWJhc2UvcGVyZi92MS9UcmFuc3BvcnRJbmZvJERpc3BhdGNoRGVzdGluYXRpb247OkUI9wYSQFtMY29tL2dvb2dsZS9maXJlYmFzZS9wZXJmL3YxL1RyYW5zcG9ydEluZm8kRGlzcGF0Y2hEZXN0aW5hdGlvbjs6Sgj4BhJFTGNvbS9nb29nbGUvZmlyZWJhc2UvcmVtb3RlY29uZmlnL0ZpcmViYXNlUmVtb3RlQ29uZmlnRXhjZXB0aW9uJENvZGU7OksI+QYSRltMY29tL2dvb2dsZS9maXJlYmFzZS9yZW1vdGVjb25maWcvRmlyZWJhc2VSZW1vdGVDb25maWdFeGNlcHRpb24kQ29kZTs6TQj6BhJITGNvbS9nb29nbGUvZmlyZWJhc2UvcmVtb3RlY29uZmlnL2ludGVybmFsL0NvbmZpZ0ZldGNoSGFuZGxlciRGZXRjaFR5cGU7Ok4I+wYSSVtMY29tL2dvb2dsZS9maXJlYmFzZS9yZW1vdGVjb25maWcvaW50ZXJuYWwvQ29uZmlnRmV0Y2hIYW5kbGVyJEZldGNoVHlwZTs6Nwj8BhIyTGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvRGF0YUNvbGxlY3Rpb25TdGF0ZTs6OAj9BhIzW0xjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL0RhdGFDb2xsZWN0aW9uU3RhdGU7Oi0I/gYSKExjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL0V2ZW50VHlwZTs6Lgj/BhIpW0xjb20vZ29vZ2xlL2ZpcmViYXNlL3Nlc3Npb25zL0V2ZW50VHlwZTs6MgiABxItTGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvTG9nRW52aXJvbm1lbnQ7OjMIgQcSLltMY29tL2dvb2dsZS9maXJlYmFzZS9zZXNzaW9ucy9Mb2dFbnZpcm9ubWVudDs6PgiCBxI5TGNvbS9nb29nbGUvZmlyZWJhc2Uvc2Vzc2lvbnMvYXBpL1Nlc3Npb25TdWJzY3JpYmVyJE5hbWU7Oj8IgwcSOltMY29tL2dvb2dsZS9maXJlYmFzZS9zZXNzaW9ucy9hcGkvU2Vzc2lvblN1YnNjcmliZXIkTmFtZTs6LwiEBxIqTGNvbS9nb29nbGUvcHJvdG9idWYvRmllbGRUeXBlJENvbGxlY3Rpb247OjAIhQcSK1tMY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFR5cGUkQ29sbGVjdGlvbjs6JAiGBxIfTGNvbS9nb29nbGUvcHJvdG9idWYvRmllbGRUeXBlOzolCIcHEiBbTGNvbS9nb29nbGUvcHJvdG9idWYvRmllbGRUeXBlOzo+CIgHEjlMY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZSRNZXRob2RUb0ludm9rZTs6PwiJBxI6W0xjb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlJE1ldGhvZFRvSW52b2tlOzojCIoHEh5MY29tL2dvb2dsZS9wcm90b2J1Zi9KYXZhVHlwZTs6JAiLBxIfW0xjb20vZ29vZ2xlL3Byb3RvYnVmL0phdmFUeXBlOzomCIwHEiFMY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b1N5bnRheDs6JwiNBxIiW0xjb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvU3ludGF4OzovCI4HEipMY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0JEZpZWxkVHlwZTs6MAiPBxIrW0xjb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQkRmllbGRUeXBlOzouCJAHEilMY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0JEphdmFUeXBlOzovCJEHEipbTGNvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdCRKYXZhVHlwZTs6LAiSBxInTGNvbS9nb29nbGUvcHJvdG9idWYvV3JpdGVyJEZpZWxkT3JkZXI7Oi0IkwcSKFtMY29tL2dvb2dsZS9wcm90b2J1Zi9Xcml0ZXIkRmllbGRPcmRlcjs6TwiUBxJKTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGFzdG9yZS9EYXJrVGhlbWVDb25maWdQcm90bzs6UAiVBxJLW0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kYXRhc3RvcmUvRGFya1RoZW1lQ29uZmlnUHJvdG87OkoIlgcSRUxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kYXRhc3RvcmUvVGhlbWVCcmFuZFByb3RvOzpLCJcHEkZbTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGFzdG9yZS9UaGVtZUJyYW5kUHJvdG87OlwImAcSV0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kZXNpZ25zeXN0ZW0vY29tcG9uZW50L3Njcm9sbGJhci9UaHVtYlN0YXRlOzpdCJkHElhbTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2Rlc2lnbnN5c3RlbS9jb21wb25lbnQvc2Nyb2xsYmFyL1RodW1iU3RhdGU7OkYImgcSQUxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kb21haW4vVG9waWNTb3J0RmllbGQ7OkcImwcSQltMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvZG9tYWluL1RvcGljU29ydEZpZWxkOzpLCJwHEkZMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbW9kZWwvZGF0YS9EYXJrVGhlbWVDb25maWc7OkwInQcSR1tMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbW9kZWwvZGF0YS9EYXJrVGhlbWVDb25maWc7OkYIngcSQUxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9tb2RlbC9kYXRhL1RoZW1lQnJhbmQ7OkcInwcSQltMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbW9kZWwvZGF0YS9UaGVtZUJyYW5kOzoeCKAHEhlMa290bGluL0RlcHJlY2F0aW9uTGV2ZWw7Oh8IoQcSGltMa290bGluL0RlcHJlY2F0aW9uTGV2ZWw7OiIIogcSHUxrb3RsaW4vTGF6eVRocmVhZFNhZmV0eU1vZGU7OiMIowcSHltMa290bGluL0xhenlUaHJlYWRTYWZldHlNb2RlOzo3CKQHEjJMa290bGluL2Nvcm91dGluZXMvaW50cmluc2ljcy9Db3JvdXRpbmVTaW5nbGV0b25zOzo4CKUHEjNbTGtvdGxpbi9jb3JvdXRpbmVzL2ludHJpbnNpY3MvQ29yb3V0aW5lU2luZ2xldG9uczs6HwimBxIaTGtvdGxpbi90aW1lL0R1cmF0aW9uVW5pdDs6IAinBxIbW0xrb3RsaW4vdGltZS9EdXJhdGlvblVuaXQ7OigIqAcSI0xrb3RsaW54L2Nvcm91dGluZXMvQ29yb3V0aW5lU3RhcnQ7OikIqQcSJFtMa290bGlueC9jb3JvdXRpbmVzL0Nvcm91dGluZVN0YXJ0OzoxCKoHEixMa290bGlueC9jb3JvdXRpbmVzL2NoYW5uZWxzL0J1ZmZlck92ZXJmbG93OzoyCKsHEi1bTGtvdGxpbngvY29yb3V0aW5lcy9jaGFubmVscy9CdWZmZXJPdmVyZmxvdzs6LQisBxIoTGtvdGxpbngvY29yb3V0aW5lcy9mbG93L1NoYXJpbmdDb21tYW5kOzouCK0HEilbTGtvdGxpbngvY29yb3V0aW5lcy9mbG93L1NoYXJpbmdDb21tYW5kOzpDCK4HEj5Ma290bGlueC9jb3JvdXRpbmVzL3NjaGVkdWxpbmcvQ29yb3V0aW5lU2NoZWR1bGVyJFdvcmtlclN0YXRlOzpECK8HEj9bTGtvdGxpbngvY29yb3V0aW5lcy9zY2hlZHVsaW5nL0Nvcm91dGluZVNjaGVkdWxlciRXb3JrZXJTdGF0ZTs6OQiwBxI0TGtvdGxpbngvY29yb3V0aW5lcy9zZWxlY3RzL1RyeVNlbGVjdERldGFpbGVkUmVzdWx0Ozo6CLEHEjVbTGtvdGxpbngvY29yb3V0aW5lcy9zZWxlY3RzL1RyeVNlbGVjdERldGFpbGVkUmVzdWx0OzopCLIHEiRMa290bGlueC9kYXRldGltZS9mb3JtYXQvQW1QbU1hcmtlcjs6KgizBxIlW0xrb3RsaW54L2RhdGV0aW1lL2Zvcm1hdC9BbVBtTWFya2VyOzomCLQHEiFMa290bGlueC9kYXRldGltZS9mb3JtYXQvUGFkZGluZzs6Jwi1BxIiW0xrb3RsaW54L2RhdGV0aW1lL2Zvcm1hdC9QYWRkaW5nOzo4CLYHEjNMa290bGlueC9zZXJpYWxpemF0aW9uL2pzb24vQ2xhc3NEaXNjcmltaW5hdG9yTW9kZTs6OQi3BxI0W0xrb3RsaW54L3NlcmlhbGl6YXRpb24vanNvbi9DbGFzc0Rpc2NyaW1pbmF0b3JNb2RlOzo0CLgHEi9Ma290bGlueC9zZXJpYWxpemF0aW9uL2pzb24vaW50ZXJuYWwvV3JpdGVNb2RlOzo1CLkHEjBbTGtvdGxpbngvc2VyaWFsaXphdGlvbi9qc29uL2ludGVybmFsL1dyaXRlTW9kZTs6Fwi6BxISTG9raHR0cDMvUHJvdG9jb2w7OhgIuwcSE1tMb2todHRwMy9Qcm90b2NvbDs6GQi8BxIUTG9raHR0cDMvVGxzVmVyc2lvbjs6Ggi9BxIVW0xva2h0dHAzL1Rsc1ZlcnNpb247OicIvgcSIkxva2h0dHAzL2ludGVybmFsL2h0dHAyL0Vycm9yQ29kZTs6KAi/BxIjW0xva2h0dHAzL2ludGVybmFsL2h0dHAyL0Vycm9yQ29kZTs6MwjABxIuTG9raHR0cDMvbG9nZ2luZy9IdHRwTG9nZ2luZ0ludGVyY2VwdG9yJExldmVsOzo0CMEHEi9bTG9raHR0cDMvbG9nZ2luZy9IdHRwTG9nZ2luZ0ludGVyY2VwdG9yJExldmVsOzofCMIHEhpMa290bGluL2VudW1zL0VudW1FbnRyaWVzOzozCMMHEi5MYW5kcm9pZHgvbGlmZWN5Y2xlL0xpZmVjeWNsZSRFdmVudCRDb21wYW5pb247OjYIxAcSMUxhbmRyb2lkeC9hcHBjb21wYXQvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldzs6MAjFBxIrTGFuZHJvaWR4L2FwcGNvbXBhdC92aWV3L21lbnUvTWVudUl0ZW1JbXBsOzopCMYHEiRMYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZTs6OwjHBxI2TGFuZHJvaWR4L2FwcGNvbXBhdC92aWV3L21lbnUvTWVudUJ1aWxkZXIkSXRlbUludm9rZXI7OkQIyAcSP0xhbmRyb2lkeC9hcHBjb21wYXQvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldyRQb3B1cENhbGxiYWNrOzo0CMkHEi9MYW5kcm9pZHgvYXBwY29tcGF0L3ZpZXcvbWVudS9FeHBhbmRlZE1lbnVWaWV3Ozo0CMoHEi9MYW5kcm9pZHgvYXBwY29tcGF0L3ZpZXcvbWVudS9MaXN0TWVudUl0ZW1WaWV3OzoiCMsHEh1MYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyOzozCMwHEi5MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BY3Rpb25CYXJDb250YWluZXI7OjoIzQcSNUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L1Njcm9sbGluZ1RhYkNvbnRhaW5lclZpZXc7OjUIzgcSMExhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3Ozo3CM8HEjJMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BY3Rpb25CYXJPdmVybGF5TGF5b3V0OzpTCNAHEk5MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BY3Rpb25CYXJPdmVybGF5TGF5b3V0JEFjdGlvbkJhclZpc2liaWxpdHlDYWxsYmFjazs6IwjRBxIeTGFuZHJvaWQvdmlldy9XaW5kb3ckQ2FsbGJhY2s7Oi8I0gcSKkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FjdGlvbk1lbnVWaWV3OzoYCNMHEhNMYW5kcm9pZC92aWV3L01lbnU7OkcI1AcSQkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FjdGlvbk1lbnVWaWV3JE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyOzo0CNUHEi9MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BY3Rpb25NZW51UHJlc2VudGVyOzo+CNYHEjlMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRBdXRvQ29tcGxldGVUZXh0Vmlldzs6JwjXBxIiTGFuZHJvaWQvdmlldy9BY3Rpb25Nb2RlJENhbGxiYWNrOzomCNgHEiFMYW5kcm9pZC90ZXh0L21ldGhvZC9LZXlMaXN0ZW5lcjs6MAjZBxIrTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0QnV0dG9uOzo5CNoHEjRMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRFbW9qaVRleHRIZWxwZXI7OiAI2wcSG1tMYW5kcm9pZC90ZXh0L0lucHV0RmlsdGVyOzoyCNwHEi1MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRDaGVja0JveDs6OQjdBxI0TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0Q2hlY2tlZFRleHRWaWV3OzoyCN4HEi1MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRFZGl0VGV4dDs6PgjfBxI5TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0RWRpdFRleHQkU3VwZXJDYWxsZXI7OhwI4AcSF0xhbmRyb2lkL3RleHQvRWRpdGFibGU7OjEI4QcSLExhbmRyb2lkL3ZpZXcvdGV4dGNsYXNzaWZpZXIvVGV4dENsYXNzaWZpZXI7OjUI4gcSMExhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdEltYWdlQnV0dG9uOzoeCOMHEhlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7OhYI5AcSEUxhbmRyb2lkL25ldC9Vcmk7OjMI5QcSLkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdEltYWdlVmlldzs6QwjmBxI+TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0TXVsdGlBdXRvQ29tcGxldGVUZXh0Vmlldzs6NQjnBxIwTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0UmFkaW9CdXR0b247OjEI6AcSLExhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFNwaW5uZXI7Oj4I6QcSOUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFNwaW5uZXIkU3Bpbm5lclBvcHVwOzodCOoHEhhMYW5kcm9pZC93aWRnZXQvQWRhcHRlcjs6JAjrBxIfTGFuZHJvaWQvd2lkZ2V0L1NwaW5uZXJBZGFwdGVyOzoyCOwHEi1MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRUZXh0Vmlldzs6PgjtBxI5TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0VGV4dFZpZXckU3VwZXJDYWxsZXI7OjYI7gcSMUxhbmRyb2lkeC9jb3JlL3RleHQvUHJlY29tcHV0ZWRUZXh0Q29tcGF0JFBhcmFtczs6LwjvBxIqTGFuZHJvaWR4L2NvcmUvdGV4dC9QcmVjb21wdXRlZFRleHRDb21wYXQ7OjYI8AcSMUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFRvZ2dsZUJ1dHRvbjs6MAjxBxIrTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQnV0dG9uQmFyTGF5b3V0OzozCPIHEi5MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9Db250ZW50RnJhbWVMYXlvdXQ7Oh4I8wcSGUxhbmRyb2lkL3V0aWwvVHlwZWRWYWx1ZTs6RAj0BxI/TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQ29udGVudEZyYW1lTGF5b3V0JE9uQXR0YWNoTGlzdGVuZXI7OjEI9QcSLExhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0Ryb3BEb3duTGlzdFZpZXc7OjYI9gcSMUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0ZpdFdpbmRvd3NGcmFtZUxheW91dDs6Twj3BxJKTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvRml0V2luZG93c1ZpZXdHcm91cCRPbkZpdFN5c3RlbVdpbmRvd3NMaXN0ZW5lcjs6Nwj4BxIyTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvRml0V2luZG93c0xpbmVhckxheW91dDs6Mwj5BxIuTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvTGluZWFyTGF5b3V0Q29tcGF0OzpFCPoHEkBMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9NZW51UG9wdXBXaW5kb3ckTWVudURyb3BEb3duTGlzdFZpZXc7OjYI+wcSMUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L01lbnVJdGVtSG92ZXJMaXN0ZW5lcjs6Pgj8BxI5TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvU2VhcmNoVmlldyRTZWFyY2hBdXRvQ29tcGxldGU7OisI/QcSJkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L1NlYXJjaFZpZXc7OigI/gcSI0xhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L1Rvb2xiYXI7OhoI/wcSFUxqYXZhL3V0aWwvQXJyYXlMaXN0OzogCIAIEhtMYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlcjs6LQiBCBIoTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvRGVjb3JUb29sYmFyOzooCIIIEiNMYW5kcm9pZC92aWV3L1ZpZXckT25DbGlja0xpc3RlbmVyOzpACIMIEjtMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9Ub29sYmFyJE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyOzovCIQIEipMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9WaWV3U3R1YkNvbXBhdDs6QQiFCBI8TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvVmlld1N0dWJDb21wYXQkT25JbmZsYXRlTGlzdGVuZXI7OjYIhggSMUxhbmRyb2lkeC9jb21wb3NlL21hdGVyaWFsL3JpcHBsZS9SaXBwbGVIb3N0Vmlldzs6MwiHCBIuTGFuZHJvaWR4L2NvbXBvc2UvdWkvZ3JhcGhpY3MvbGF5ZXIvVmlld0xheWVyOzowCIgIEitMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9DYW52YXNIb2xkZXI7OkEIiQgSPExhbmRyb2lkeC9jb21wb3NlL3VpL2dyYXBoaWNzL2xheWVyL3ZpZXcvRHJhd0NoaWxkQ29udGFpbmVyOzo3CIoIEjJMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BYnN0cmFjdENvbXBvc2VWaWV3OzoyCIsIEi1MYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL0NvbXBvc2l0aW9uQ29udGV4dDs6OwiMCBI2TGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vVmlld0NvbXBvc2l0aW9uU3RyYXRlZ3k7OjgIjQgSM0xhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FjY2Vzc2liaWxpdHlNYW5hZ2VyOzo/CI4IEjpMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BbmRyb2lkQWNjZXNzaWJpbGl0eU1hbmFnZXI7OjcIjwgSMkxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FuZHJvaWRWaWV3c0hhbmRsZXI7OiwIkAgSJ0xhbmRyb2lkeC9jb21wb3NlL3VpL2F1dG9maWxsL0F1dG9maWxsOzozCJEIEi5MYW5kcm9pZHgvY29tcG9zZS91aS9hdXRvZmlsbC9BdXRvZmlsbE1hbmFnZXI7OjAIkggSK0xhbmRyb2lkeC9jb21wb3NlL3VpL2F1dG9maWxsL0F1dG9maWxsVHJlZTs6NAiTCBIvTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQW5kcm9pZENsaXBib2FyZDs6LQiUCBIoTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQ2xpcGJvYXJkOzo7CJUIEjZMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BbmRyb2lkQ2xpcGJvYXJkTWFuYWdlcjs6NAiWCBIvTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQ2xpcGJvYXJkTWFuYWdlcjs6KAiXCBIjTGFuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbjs6RgiYCBJBTGFuZHJvaWR4L2NvbXBvc2UvdWkvY29udGVudGNhcHR1cmUvQW5kcm9pZENvbnRlbnRDYXB0dXJlTWFuYWdlcjs6KQiZCBIkTGtvdGxpbi9jb3JvdXRpbmVzL0Nvcm91dGluZUNvbnRleHQ7OicImggSIkxhbmRyb2lkeC9jb21wb3NlL3VpL3VuaXQvRGVuc2l0eTs6QAibCBI7TGFuZHJvaWR4L2NvbXBvc2UvdWkvZHJhZ2FuZGRyb3AvQW5kcm9pZERyYWdBbmREcm9wTWFuYWdlcjs6OQicCBI0TGFuZHJvaWR4L2NvbXBvc2UvdWkvZHJhZ2FuZGRyb3AvRHJhZ0FuZERyb3BNYW5hZ2VyOzooCJ0IEiNMYW5kcm9pZHgvY29tcG9zZS91aS9nZW9tZXRyeS9SZWN0OzorCJ4IEiZMYW5kcm9pZHgvY29tcG9zZS91aS9mb2N1cy9Gb2N1c093bmVyOzo4CJ8IEjNMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L2ZvbnQvRm9udEZhbWlseSRSZXNvbHZlcjs6OAigCBIzTGFuZHJvaWR4L2NvbXBvc2UvdWkvdGV4dC9mb250L0ZvbnQkUmVzb3VyY2VMb2FkZXI7OlcIoQgSUkxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0xpZmVjeWNsZVJldGFpbmVkVmFsdWVzU3RvcmVPd25lciRGcmFtZUVuZFNjaGVkdWxlcjs6MwiiCBIuTGFuZHJvaWR4L2NvbXBvc2UvdWkvZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0Ozo4CKMIEjNMYW5kcm9pZHgvY29tcG9zZS91aS9oYXB0aWNmZWVkYmFjay9IYXB0aWNGZWVkYmFjazs6MQikCBIsTGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvSW5wdXRNb2RlTWFuYWdlcjs6MAilCBIrTGFuZHJvaWR4L2NvbXBvc2UvdWkvbGF5b3V0L0luc2V0c0xpc3RlbmVyOzonCKYIEiJMYW5kcm9pZHgvY29sbGVjdGlvbi9JbnRPYmplY3RNYXA7Oi4IpwgSKUxhbmRyb2lkeC9jb2xsZWN0aW9uL011dGFibGVJbnRPYmplY3RNYXA7OjgIqAgSM0xhbmRyb2lkeC9jb21wb3NlL3VpL21vZGlmaWVyL01vZGlmaWVyTG9jYWxNYW5hZ2VyOzoyCKkIEi1MYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL091dE9mRnJhbWVFeGVjdXRvcjs6OgiqCBI1TGFuZHJvaWR4L2NvbXBvc2UvdWkvbGF5b3V0L1BsYWNlYWJsZSRQbGFjZW1lbnRTY29wZTs6OwirCBI2TGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9Qb2ludGVySWNvblNlcnZpY2U7OloIrAgSVUxhbmRyb2lkeC9jb21wb3NlL3VpL2lucHV0L2luZGlyZWN0L0luZGlyZWN0UG9pbnRlckV2ZW50UHJpbWFyeURpcmVjdGlvbmFsTW90aW9uQXhpczs6LgitCBIpTGFuZHJvaWR4L2NvbXBvc2UvdWkvc3BhdGlhbC9SZWN0TWFuYWdlcjs6OgiuCBI1TGFuZHJvaWR4L2NvbXBvc2UvcnVudGltZS9yZXRhaW4vUmV0YWluZWRWYWx1ZXNTdG9yZTs6KgivCBIlTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9MYXlvdXROb2RlOzorCLAIEiZMYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL1Jvb3RGb3JUZXN0OzozCLEIEi5MYW5kcm9pZHgvY29tcG9zZS91aS9zZW1hbnRpY3MvU2VtYW50aWNzT3duZXI7OjMIsggSLkxhbmRyb2lkeC9jb21wb3NlL3VpL25vZGUvTGF5b3V0Tm9kZURyYXdTY29wZTs6NQizCBIwTGFuZHJvaWR4L2NvbXBvc2UvdWkvbm9kZS9Pd25lclNuYXBzaG90T2JzZXJ2ZXI7Oj4ItAgSOUxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL1NvZnR3YXJlS2V5Ym9hcmRDb250cm9sbGVyOzo2CLUIEjFMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L2lucHV0L1RleHRJbnB1dFNlcnZpY2U7Oi8ItggSKkxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL1RleHRUb29sYmFyOzpECLcIEj9MYW5kcm9pZHgvY29tcG9zZS91aS9ub2RlL1Jvb3RGb3JUZXN0JFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjs6NQi4CBIwTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vVmlld0NvbmZpZ3VyYXRpb247OkUIuQgSQExhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FuZHJvaWRDb21wb3NlVmlldyRWaWV3VHJlZU93bmVyczs6Lgi6CBIpTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vV2luZG93SW5mbzs6Ogi7CBI1TGFuZHJvaWR4L2NvbXBvc2UvdWkvYXV0b2ZpbGwvQW5kcm9pZEF1dG9maWxsTWFuYWdlcjs6JQi8CBIgTGtvdGxpbi9qdm0vZnVuY3Rpb25zL0Z1bmN0aW9uMTs6GAi9CBITTGphdmEvdXRpbC9IYXNoTWFwOzovCL4IEipMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9Db21wb3NlVmlldzs6JQi/CBIgTGtvdGxpbi9qdm0vZnVuY3Rpb25zL0Z1bmN0aW9uMjs6LQjACBIoTGFuZHJvaWR4L2NvbXBvc2UvdWkvd2luZG93L1BvcHVwTGF5b3V0OzouCMEIEilMYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zOzozCMIIEi5MYW5kcm9pZHgvY29tcG9zZS91aS9sYXlvdXQvTGF5b3V0Q29vcmRpbmF0ZXM7OicIwwgSIkxhbmRyb2lkeC9jb21wb3NlL3VpL3VuaXQvSW50U2l6ZTs6NwjECBIyTGFuZHJvaWR4L2NvbXBvc2UvdWkvd2luZG93L1BvcHVwUG9zaXRpb25Qcm92aWRlcjs6JwjFCBIiTGFuZHJvaWR4L2NvbXBvc2UvdWkvdW5pdC9JbnRSZWN0OzoxCMYIEixMYW5kcm9pZHgvY29yZS92aWV3L2luc2V0cy9Qcm90ZWN0aW9uTGF5b3V0Ozo2CMcIEjFMYW5kcm9pZHgvY29yZS92aWV3L2luc2V0cy9TeXN0ZW1CYXJTdGF0ZU1vbml0b3I7OiwIyAgSJ0xhbmRyb2lkeC9jb3JlL3dpZGdldC9OZXN0ZWRTY3JvbGxWaWV3Ozo2CMkIEjFMYW5kcm9pZHgvY29yZS92aWV3L1Njcm9sbEZlZWRiYWNrUHJvdmlkZXJDb21wYXQ7OkMIyggSPkxhbmRyb2lkeC9jb3JlL3dpZGdldC9OZXN0ZWRTY3JvbGxWaWV3JE9uU2Nyb2xsQ2hhbmdlTGlzdGVuZXI7OjIIywgSLUxhbmRyb2lkeC9mcmFnbWVudC9hcHAvRnJhZ21lbnRDb250YWluZXJWaWV3OzolCMwIEiBMYW5kcm9pZHgvZnJhZ21lbnQvYXBwL0ZyYWdtZW50OzopCM0IEiRMYW5kcm9pZC9hbmltYXRpb24vTGF5b3V0VHJhbnNpdGlvbjs6NAjOCBIvTGFuZHJvaWQvdmlldy9WaWV3JE9uQXBwbHlXaW5kb3dJbnNldHNMaXN0ZW5lcjs6JAjPCBIfTGFuZHJvaWR4L3dvcmsvQ29yb3V0aW5lV29ya2VyOzobCNAIEhZMYW5kcm9pZHgvd29yay9Xb3JrZXI7OjoI0QgSNUxhbmRyb2lkeC93b3JrL2ltcGwvd29ya2Vycy9Db25zdHJhaW50VHJhY2tpbmdXb3JrZXI7OjMI0ggSLkxhbmRyb2lkeC93b3JrL2ltcGwvd29ya2Vycy9EaWFnbm9zdGljc1dvcmtlcjs6SQjTCBJETGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9zeW5jL3dvcmtlcnMvRGVsZWdhdGluZ1dvcmtlcjs6QwjUCBI+TGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9zeW5jL3dvcmtlcnMvU3luY1dvcmtlcjs6UwjVCBJOTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGFzdG9yZS9OaWFQcmVmZXJlbmNlc0RhdGFTb3VyY2U7OlEI1ggSTExjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9kYXRhL3JlcG9zaXRvcnkvVG9waWNzUmVwb3NpdG9yeTs6TwjXCBJKTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGEvcmVwb3NpdG9yeS9OZXdzUmVwb3NpdG9yeTs6WQjYCBJUTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2RhdGEvcmVwb3NpdG9yeS9TZWFyY2hDb250ZW50c1JlcG9zaXRvcnk7Oi0I2QgSKExrb3RsaW54L2Nvcm91dGluZXMvQ29yb3V0aW5lRGlzcGF0Y2hlcjs6SgjaCBJFTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9jb3JlL2FuYWx5dGljcy9BbmFseXRpY3NIZWxwZXI7OkYI2wgSQUxjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvc3luYy9zdGF0dXMvU3luY1N1YnNjcmliZXI7OmsI3AgSZkxhbmRyb2lkeC9zYXZlZHN0YXRlL3NlcmlhbGl6YXRpb24vc2VyaWFsaXplcnMvU3BhcnNlQXJyYXlTZXJpYWxpemVyJFNwYXJzZUFycmF5U3Vycm9nYXRlJCRzZXJpYWxpemVyOzo5CN0IEjRMa290bGlueC9zZXJpYWxpemF0aW9uL2Rlc2NyaXB0b3JzL1NlcmlhbERlc2NyaXB0b3I7OlwI3ggSV0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL21vZGVsL05ldHdvcmtDaGFuZ2VMaXN0JCRzZXJpYWxpemVyOzpeCN8IEllMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbmV0d29yay9tb2RlbC9OZXR3b3JrTmV3c1Jlc291cmNlJCRzZXJpYWxpemVyOzpXCOAIElJMY29tL2dvb2dsZS9zYW1wbGVzL2FwcHMvbm93aW5hbmRyb2lkL2NvcmUvbmV0d29yay9tb2RlbC9OZXR3b3JrVG9waWMkJHNlcmlhbGl6ZXI7Ol0I4QgSWExjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvY29yZS9uZXR3b3JrL3JldHJvZml0L05ldHdvcmtSZXNwb25zZSQkc2VyaWFsaXplcjs6aAjiCBJjTGNvbS9nb29nbGUvc2FtcGxlcy9hcHBzL25vd2luYW5kcm9pZC9mZWF0dXJlL2ludGVyZXN0cy9hcGkvbmF2aWdhdGlvbi9JbnRlcmVzdHNOYXZLZXkkJHNlcmlhbGl6ZXI7OmAI4wgSW0xjb20vZ29vZ2xlL3NhbXBsZXMvYXBwcy9ub3dpbmFuZHJvaWQvZmVhdHVyZS90b3BpYy9hcGkvbmF2aWdhdGlvbi9Ub3BpY05hdktleSQkc2VyaWFsaXplcjs6RQjkCBJATGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vTGlmZWN5Y2xlUmV0YWluZWRWYWx1ZXNTdG9yZU93bmVyOzotCOUIEihMYW5kcm9pZHgvbGlmZWN5Y2xlL1NhdmVkU3RhdGVIYW5kbGVzVk07Oj4I5ggSOUxhbmRyb2lkeC9saWZlY3ljbGUvdmlld21vZGVsL25hdmlnYXRpb24zL0VudHJ5Vmlld01vZGVsOzo8COcIEjdMYW5kcm9pZHgvbG9hZGVyL2FwcC9Mb2FkZXJNYW5hZ2VySW1wbCRMb2FkZXJWaWV3TW9kZWw7OkcI6AgSQkxhbmRyb2lkeC9saWZlY3ljbGUvTGVnYWN5U2F2ZWRTdGF0ZUhhbmRsZUNvbnRyb2xsZXIkT25SZWNyZWF0aW9uOzooCOkIEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTIzOzonCOoIEiJMYW5kcm9pZHgvYWN0aXZpdHkvU3lzdGVtQmFyU3R5bGU7OhoI6wgSFUxhbmRyb2lkL3ZpZXcvV2luZG93OzooCOwIEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTI2OzooCO0IEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTI4OzooCO4IEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTI5OzooCO8IEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTMwOzooCPAIEiNMYW5kcm9pZHgvYWN0aXZpdHkvRWRnZVRvRWRnZUFwaTM1Ozo5CPEIEjRMYW5kcm9pZHgvYXBwY29tcGF0L2FwcC9BcHBDb21wYXREZWxlZ2F0ZSRBcGkyNEltcGw7OhwI8ggSF0xhbmRyb2lkL29zL0xvY2FsZUxpc3Q7OjkI8wgSNExhbmRyb2lkeC9hcHBjb21wYXQvYXBwL0FwcENvbXBhdERlbGVnYXRlJEFwaTMzSW1wbDs6PQj0CBI4TGFuZHJvaWR4L2FwcGNvbXBhdC9hcHAvQXBwQ29tcGF0RGVsZWdhdGVJbXBsJEFwaTIxSW1wbDs6Hgj1CBIZTGFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyOzoXCPYIEhJMamF2YS91dGlsL0xvY2FsZTs6PQj3CBI4TGFuZHJvaWR4L2FwcGNvbXBhdC9hcHAvQXBwQ29tcGF0RGVsZWdhdGVJbXBsJEFwaTI0SW1wbDs6KAj4CBIjTGFuZHJvaWR4L2NvcmUvb3MvTG9jYWxlTGlzdENvbXBhdDs6PQj5CBI4TGFuZHJvaWR4L2FwcGNvbXBhdC9hcHAvQXBwQ29tcGF0RGVsZWdhdGVJbXBsJEFwaTMzSW1wbDs6LQj6CBIoTGFuZHJvaWQvd2luZG93L09uQmFja0ludm9rZWREaXNwYXRjaGVyOzozCPsIEi5MYW5kcm9pZHgvYXBwY29tcGF0L2FwcC9BcHBDb21wYXREZWxlZ2F0ZUltcGw7OisI/AgSJkxhbmRyb2lkL3dpbmRvdy9PbkJhY2tJbnZva2VkQ2FsbGJhY2s7OkcI/QgSQkxhbmRyb2lkeC9hcHBjb21wYXQvYXBwL0FwcExvY2FsZXNNZXRhZGF0YUhvbGRlclNlcnZpY2UkQXBpMjRJbXBsOzo7CP4IEjZMYW5kcm9pZHgvYXBwY29tcGF0L3Jlc291cmNlcy9Db21wYXRpYmlsaXR5JEFwaTIxSW1wbDs6JAj/CBIfTGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzOzojCIAJEh5Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlcjs6KgiBCRIlTGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJFRoZW1lOzo+CIIJEjlMYW5kcm9pZHgvYXBwY29tcGF0L3ZpZXcvV2luZG93Q2FsbGJhY2tXcmFwcGVyJEFwaTIzSW1wbDs6HwiDCRIaTGFuZHJvaWQvdmlldy9TZWFyY2hFdmVudDs6HgiECRIZTGFuZHJvaWQvdmlldy9BY3Rpb25Nb2RlOzo+CIUJEjlMYW5kcm9pZHgvYXBwY29tcGF0L3ZpZXcvV2luZG93Q2FsbGJhY2tXcmFwcGVyJEFwaTI0SW1wbDs6PgiGCRI5TGFuZHJvaWR4L2FwcGNvbXBhdC92aWV3L1dpbmRvd0NhbGxiYWNrV3JhcHBlciRBcGkyNkltcGw7Ok4IhwkSSUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFJlY2VpdmVDb250ZW50SGVscGVyJE9uRHJvcEFwaTI0SW1wbDs6HQiICRIYTGFuZHJvaWQvdmlldy9EcmFnRXZlbnQ7OjsIiQkSNkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFNwaW5uZXIkQXBpMjNJbXBsOzoqCIoJEiVMYW5kcm9pZC93aWRnZXQvVGhlbWVkU3Bpbm5lckFkYXB0ZXI7OkgIiwkSQ0xhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFRleHRDbGFzc2lmaWVySGVscGVyJEFwaTI2SW1wbDs6PgiMCRI5TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0VGV4dEhlbHBlciRBcGkyMUltcGw7Oj4IjQkSOUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0FwcENvbXBhdFRleHRIZWxwZXIkQXBpMjRJbXBsOzo+CI4JEjlMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRUZXh0SGVscGVyJEFwaTI2SW1wbDs6PgiPCRI5TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvQXBwQ29tcGF0VGV4dEhlbHBlciRBcGkyOEltcGw7OiAIkAkSG0xhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlOzpKCJEJEkVMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9BcHBDb21wYXRUZXh0Vmlld0F1dG9TaXplSGVscGVyJEFwaTIzSW1wbDs6JAiSCRIfTGFuZHJvaWQvdGV4dC9MYXlvdXQkQWxpZ25tZW50OzodCJMJEhhMYW5kcm9pZC90ZXh0L1RleHRQYWludDs6IAiUCRIbTGFuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQ7OjsIlQkSNkxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0Ryb3BEb3duTGlzdFZpZXckQXBpMjFJbXBsOzo7CJYJEjZMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9Ecm9wRG93bkxpc3RWaWV3JEFwaTMzSW1wbDs6IQiXCRIcTGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3Ozo6CJgJEjVMYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9MaXN0UG9wdXBXaW5kb3ckQXBpMjRJbXBsOzohCJkJEhxMYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3c7OjoImgkSNUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdyRBcGkyOUltcGw7OjoImwkSNUxhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L01lbnVQb3B1cFdpbmRvdyRBcGkyM0ltcGw7OiQInAkSH0xhbmRyb2lkL3RyYW5zaXRpb24vVHJhbnNpdGlvbjs6OgidCRI1TGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvTWVudVBvcHVwV2luZG93JEFwaTI5SW1wbDs6NQieCRIwTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvU2VhcmNoVmlldyRBcGkyOUltcGw7OioInwkSJUxhbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldzs6MgigCRItTGFuZHJvaWR4L2FwcGNvbXBhdC93aWRnZXQvVG9vbGJhciRBcGkzM0ltcGw7OhkIoQkSFExqYXZhL2xhbmcvUnVubmFibGU7OjgIogkSM0xhbmRyb2lkeC9hcHBjb21wYXQvd2lkZ2V0L1Rvb2x0aXBDb21wYXQkQXBpMjZJbXBsOzo0CKMJEi9MYW5kcm9pZHgvYXBwY29tcGF0L3dpZGdldC9WaWV3VXRpbHMkQXBpMjlJbXBsOzo9CKQJEjhMYW5kcm9pZHgvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYnNJbnRlbnQkQXBpMjNJbXBsOzoiCKUJEh1MYW5kcm9pZC9hcHAvQWN0aXZpdHlPcHRpb25zOzo9CKYJEjhMYW5kcm9pZHgvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYnNJbnRlbnQkQXBpMjRJbXBsOzo9CKcJEjhMYW5kcm9pZHgvYnJvd3Nlci9jdXN0b210YWJzL0N1c3RvbVRhYnNJbnRlbnQkQXBpMzRJbXBsOzpKCKgJEkVMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BbmRyb2lkQ29tcG9zZVZpZXdBc3Npc3RIZWxwZXJNZXRob2RzTzs6IQipCRIcTGFuZHJvaWQvdmlldy9WaWV3U3RydWN0dXJlOzpECKoJEj9MYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BbmRyb2lkQ29tcG9zZVZpZXdGb3JjZURhcmtNb2RlUTs6RwirCRJCTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQW5kcm9pZENvbXBvc2VWaWV3U3RhcnREcmFnQW5kRHJvcE47Oj4IrAkSOUxhbmRyb2lkeC9jb21wb3NlL3VpL2RyYWdhbmRkcm9wL0RyYWdBbmREcm9wVHJhbnNmZXJEYXRhOzo/CK0JEjpMYW5kcm9pZHgvY29tcG9zZS91aS9kcmFnYW5kZHJvcC9Db21wb3NlRHJhZ1NoYWRvd0J1aWxkZXI7OkoIrgkSRUxhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FuZHJvaWRDb21wb3NlVmlld1RyYW5zbGF0aW9uQ2FsbGJhY2tTOzpQCK8JEktMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9BbmRyb2lkQ29tcG9zZVZpZXdWZXJpZmljYXRpb25IZWxwZXJNZXRob2RzTjs6NAiwCRIvTGFuZHJvaWR4L2NvbXBvc2UvdWkvaW5wdXQvcG9pbnRlci9Qb2ludGVySWNvbjs6UAixCRJLTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQW5kcm9pZENvbXBvc2VWaWV3VmVyaWZpY2F0aW9uSGVscGVyTWV0aG9kc087Oi0IsgkSKExhbmRyb2lkeC9jb21wb3NlL3VpL3BsYXRmb3JtL0FwaTMwSW1wbDs6LQizCRIoTGFuZHJvaWR4L2NvbXBvc2UvdWkvcGxhdGZvcm0vQXBpMzVJbXBsOzpACLQJEjtMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9DYWxjdWxhdGVNYXRyaXhUb1dpbmRvd0FwaTI5Ozo8CLUJEjdMYW5kcm9pZHgvY29tcG9zZS91aS9wbGF0Zm9ybS9Nb3Rpb25FdmVudFZlcmlmaWVyQXBpMjk7Oh8ItgkSGkxhbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQ7OkQItwkSP0xhbmRyb2lkeC9jb21wb3NlL3VpL3RleHQvZm9udC9Gb250V2VpZ2h0QWRqdXN0bWVudEhlbHBlckFwaTMxOzorCLgJEiZMYW5kcm9pZHgvY29tcG9zZS91aS93aW5kb3cvQXBpMjFJbXBsOzorCLkJEiZMYW5kcm9pZHgvY29tcG9zZS91aS93aW5kb3cvQXBpMjhJbXBsOzorCLoJEiZMYW5kcm9pZHgvY29tcG9zZS91aS93aW5kb3cvQXBpMzBJbXBsOzo8CLsJEjdMYW5kcm9pZHgvZW1vamkyL3RleHQvQ29uY3VycmVuY3lIZWxwZXJzJEhhbmRsZXIyOEltcGw7OhgIvAkSE0xhbmRyb2lkL29zL0xvb3Blcjs6GQi9CRIUTGFuZHJvaWQvb3MvSGFuZGxlcjs6QQi+CRI8TGFuZHJvaWR4L2Vtb2ppMi90ZXh0L0Vtb2ppRXhjbHVzaW9ucyRFbW9qaUV4Y2x1c2lvbnNfQXBpMzQ7OkAIvwkSO0xhbmRyb2lkeC9leGlmaW50ZXJmYWNlL21lZGlhL0V4aWZJbnRlcmZhY2VVdGlscyRBcGkyMUltcGw7Oh0IwAkSGExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOzpACMEJEjtMYW5kcm9pZHgvZXhpZmludGVyZmFjZS9tZWRpYS9FeGlmSW50ZXJmYWNlVXRpbHMkQXBpMjNJbXBsOzorCMIJEiZMYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVyOzokCMMJEh9MYW5kcm9pZC9tZWRpYS9NZWRpYURhdGFTb3VyY2U7OlYIxAkSUUxhbmRyb2lkeC9wcml2YWN5c2FuZGJveC9hZHMvYWRzZXJ2aWNlcy9pbnRlcm5hbC9BZFNlcnZpY2VzSW5mbyRFeHRlbnNpb25zMzBJbXBsOzpqCMUJEmVMYW5kcm9pZHgvcHJpdmFjeXNhbmRib3gvYWRzL2Fkc2VydmljZXMvamF2YS9tZWFzdXJlbWVudC9NZWFzdXJlbWVudE1hbmFnZXJGdXR1cmVzJEFwaTMzRXh0NUphdmFJbXBsOzpJCMYJEkRMYW5kcm9pZHgvcHJpdmFjeXNhbmRib3gvYWRzL2Fkc2VydmljZXMvbWVhc3VyZW1lbnQvRGVsZXRpb25SZXF1ZXN0Ozo5CMcJEjRMY29tL2dvb2dsZS9jb21tb24vdXRpbC9jb25jdXJyZW50L0xpc3RlbmFibGVGdXR1cmU7Oh4IyAkSGUxhbmRyb2lkL3ZpZXcvSW5wdXRFdmVudDs6VgjJCRJRTGFuZHJvaWR4L3ByaXZhY3lzYW5kYm94L2Fkcy9hZHNlcnZpY2VzL21lYXN1cmVtZW50L1dlYlNvdXJjZVJlZ2lzdHJhdGlvblJlcXVlc3Q7OlcIygkSUkxhbmRyb2lkeC9wcml2YWN5c2FuZGJveC9hZHMvYWRzZXJ2aWNlcy9tZWFzdXJlbWVudC9XZWJUcmlnZ2VyUmVnaXN0cmF0aW9uUmVxdWVzdDs6WgjLCRJVTGFuZHJvaWR4L3ByaXZhY3lzYW5kYm94L2Fkcy9hZHNlcnZpY2VzL21lYXN1cmVtZW50L01lYXN1cmVtZW50TWFuYWdlciRBcGkzM0V4dDVJbXBsOzomCMwJEiFMYW5kcm9pZHgvdHJhY2luZy9UcmFjZUFwaTI5SW1wbDs6NgjNCRIxTGFuZHJvaWR4L2NvbXBvc2UvYW5pbWF0aW9uL2NvcmUvUHJlY29uZGl0aW9uc0t0Ozo/CM4JEjpMYW5kcm9pZHgvY29tcG9zZS9mb3VuZGF0aW9uL2ludGVybmFsL0lubGluZUNsYXNzSGVscGVyS3Q7OkYIzwkSQUxhbmRyb2lkeC9jb21wb3NlL2ZvdW5kYXRpb24vbGF5b3V0L2ludGVybmFsL0lubGluZUNsYXNzSGVscGVyS3Q7Oi8I0AkSKkxhbmRyb2lkeC9jb21wb3NlL3J1bnRpbWUvUHJlY29uZGl0aW9uc0t0OzorCNEJEiZMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL1Nsb3RUYWJsZUt0Ozo6CNIJEjVMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL2NvbGxlY3Rpb24vTXV0YWJsZVZlY3Rvckt0Ozo7CNMJEjZMYW5kcm9pZHgvY29tcG9zZS9ydW50aW1lL3JldGFpbi9pbXBsL1ByZWNvbmRpdGlvbnNLdDs6OQjUCRI0TGFuZHJvaWR4L2NvbXBvc2UvdWkvZ3JhcGhpY3MvQW5kcm9pZFBhdGhfYW5kcm9pZEt0Ozo3CNUJEjJMYW5kcm9pZHgvY29tcG9zZS91aS9ncmFwaGljcy9JbmxpbmVDbGFzc0hlbHBlckt0Ozo3CNYJEjJMYW5kcm9pZHgvY29tcG9zZS91aS9pbnRlcm5hbC9JbmxpbmVDbGFzc0hlbHBlckt0Ozo8CNcJEjdMYW5kcm9pZHgvY29tcG9zZS91aS90ZXh0L2ludGVybmFsL0lubGluZUNsYXNzSGVscGVyS3Q7Oi0I2AkSKExhbmRyb2lkeC9jb21wb3NlL3VpL3VuaXQvQ29uc3RyYWludHNLdDs6FQjZCRIQTGphdmEvbGFuZy9Wb2lkOzozCNoJEi5MYW5kcm9pZHgvY29tcG9zZS91aS91bml0L0lubGluZUNsYXNzSGVscGVyS3Q7OisI2wkSJkxhbmRyb2lkeC9jb21wb3NlL3VpL3V0aWwvTGlzdFV0aWxzS3Q7OioI3AkSJUxhbmRyb2lkeC9jb21wb3NlL3J1bnRpbWUvQ29tcG9zZXJLdDs6GAjdCRITTGphdmEvbGFuZy9JbnRlZ2VyOzpWCN4JElFMY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9jb21tb24vR29vZ2xlUGxheVNlcnZpY2VzSW5jb3JyZWN0TWFuaWZlc3RWYWx1ZUV4Y2VwdGlvbjs6SAjfCRJDTGNvbS9nb29nbGUvYW5kcm9pZC9nbXMvY29tbW9uL0dvb2dsZVBsYXlTZXJ2aWNlc01hbmlmZXN0RXhjZXB0aW9uOzpUCOAJEk9MY29tL2dvb2dsZS9hbmRyb2lkL2dtcy9jb21tb24vR29vZ2xlUGxheVNlcnZpY2VzTWlzc2luZ01hbmlmZXN0VmFsdWVFeGNlcHRpb247OjoI4QkSNUxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9hcGkvR29vZ2xlQXBpQWN0aXZpdHk7OkMI4gkSPkxjb20vZ29vZ2xlL2FuZHJvaWQvZ21zL2NvbW1vbi9hcGkvaW50ZXJuYWwvQmFzZVBlbmRpbmdSZXN1bHQ7OkEI4wkSPExhbmRyb2lkeC9jb21wb3NlL3VpL2lucHV0L3BvaW50ZXIvUG9pbnRlcklucHV0RXZlbnRIYW5kbGVyOzo6COQJEjVMYW5kcm9pZHgvY29tcG9zZS91aS9pbnB1dC9wb2ludGVyL1BvaW50ZXJJbnB1dFNjb3BlOzo5COUJEjRMb2todHRwMy9pbnRlcm5hbC9wdWJsaWNzdWZmaXgvUHVibGljU3VmZml4RGF0YWJhc2U7QgBCBQgBEgEoQgUIAhIBK0IGCAMSAi0uQgUIBBIBYkIFCAUSAWVCBggGEgJhZUIFCAcSAVFCCQgIEgVTVFVQUEIFCAkSAUhCBggKEgJIb0IFCAsSAXBCBQgMEgFQQgUIDRIBcUIFCA4SAXJCBQgPEgFWQgUIEBIBc0IHCBESA0NZTUIGCBISAnBZQgUIExIBTkIFCBQSAUxCBQgVEgFZQgoIFhIGXF9bXlxcQgcIFxIDdHV2QgUIGBIBdkIGCBkSAkhOQgYIGhICUHZCBggbEgJOdkIGCBwS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SgsIKhBBGB8iAwwNGEoKCCsQQhgfIgIMDUoKCCwQQxgfIgIMDUoLCC0QRBggIgMMDRhKCwguEEUYICIDDA0YSgsILxBGGCAiAwwNGEoLCDAQRxghIgMMDRhKCQgxEH8YESIBDkoKCDIQgAEYJCIBDkoKCDMQgQEYJCIBDkoLCDQQjgEYJiICECZKCgg1EI8BGBEiARFKCgg2EJABGBEiARJKCgg3EJEBGCciARNKCgg4EJIBGCciARNKCgg5EJMBGCgiARNKCgg6EJQBGCgiARNKCwg7EJUBGCoiAhRxSgsIPBCWARgrIgIUcUoLCD0QlwEYLCICFHFKCwg+EJgBGC0iAhRxSgsIPxCZARguIgIUcUoLCEAQmgEYJyICFHFKCghBEJsBGDEiARZKCghCEJwBGDEiARZKCghDEJ0BGDIiARZKCghEEJ4BGDQiARdKCghFEJ8BGBciARhKCghGEKABGBciARhKCghHEKEBGBoiARhKCghIEKIBGBwiARhKCghJEKMBGBwiARhKCghKEKQBGB4iARhKCghLEKUBGB4iARhKCghMEKYBGCciARpKCghNEKcBGBEiARtKCghOEKgBGAwiARxKCghPEKkBGAwiARxKCghQEKoBGAwiARxKCghRELABGAwiAR1KCghSELEBGAwiAR5KCghTELIBGAwiAR9KCghUELMBGDEiASBKCghVELQBGDEiASBKCghWELYBGDEiASFKCghXELcBGDEiASFKCghYELgBGDIiASJKCghZELkBGDgiASdKCghaELoBGDkiASdKCghbELsBGDkiASdKCghcELwBGDkiASdKCghdEL0BGDkiASdKCgheEL4BGDkiASdKCghfEL8BGDkiASdKCghgEMABGDkiASdKCghhEMEBGDkiASdKCghiEMIBGDsiASpKCghjEMMBGDwiASpKCghkEMQBGDgiASpKCghlEMUBGD0iAStKCghmEMYBGD0iAStKCghnEMcBGD4iAStKCghoEMgBGD4iAStKCghpEMkBGD4iAStKCghqEMoBGD4iAStKCghrEMsBGD4iAStKCghsEMwBGD4iAStKCghtEM0BGD4iAStKCghuEM4BGD4iAStKCghvEM8BGD4iAStKCghwENABGD4iAStKCghxENEBGD4iAStKCghyENIBGD4iAStKCghzENMBGD4iAStK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CAkKCwwNDg8QERITFBVqmAEIARJ0LWlmIEBrb3RsaW54LnNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIGNsYXNzICoqCi1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIDwxPiB7CiAgICBzdGF0aWMgPDE+JENvbXBhbmlvbiBDb21wYW5pb247Cn0YASIGCAsQAxgBKhQaEgABAgMEBQYHCAkKCwwNDg8QEWrqAQgCEsoBLWlmIEBrb3RsaW54LnNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIGNsYXNzICoqIHsKICAgIHB1YmxpYyBzdGF0aWMgKiogSU5TVEFOQ0U7Cn0KLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgPDE+IHsKICAgIHB1YmxpYyBzdGF0aWMgPDE+IElOU1RBTkNFOwogICAga290bGlueC5zZXJpYWxpemF0aW9uLktTZXJpYWxpemVyIHNlcmlhbGl6ZXIoLi4uKTsKfRgBIgYICxARGAEqDwoBSBoEEhMUFSIEAAECA2rHAQgDEqIBLWlmIEBrb3RsaW54LnNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIGNsYXNzICoqIHsKICAgIHN0YXRpYyAqKiQqICo7Cn0KLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgPDI+JDwzPiB7CiAgICBrb3RsaW54LnNlcmlhbGl6YXRpb24uS1NlcmlhbGl6ZXIgc2VyaWFsaXplciguLi4pOwp9GAEiBggLEAkYASoUIhIEBQYHCAkKCwwNDg8QERITFBVqtQQIBBKaBC1pZiBjbGFzcyBhbmRyb2lkeC53aW5kb3cubGF5b3V0LmFkYXB0ZXIuc2lkZWNhci5TaWRlY2FyQ29tcGF0IHsKICBwdWJsaWMgKioqIHNldEV4dGVuc2lvbkNhbGxiYWNrKGFuZHJvaWR4LndpbmRvdy5sYXlvdXQuYWRhcHRlci5zaWRlY2FyLkV4dGVuc2lvbkludGVyZmFjZUNvbXBhdCRFeHRlbnNpb25DYWxsYmFja0ludGVyZmFjZSk7Cn0KLWtlZXAgY2xhc3MgYW5kcm9pZHgud2luZG93LmxheW91dC5hZGFwdGVyLnNpZGVjYXIuU2lkZWNhckNvbXBhdCRUcmFuc2xhdGluZ0NhbGxiYWNrLAogYW5kcm9pZHgud2luZG93LmxheW91dC5hZGFwdGVyLnNpZGVjYXIuRGlzdGluY3RFbGVtZW50U2lkZWNhckNhbGxiYWNrIHsKICBwdWJsaWMgKioqIG9uRGV2aWNlU3RhdGVDaGFuZ2VkKGFuZHJvaWR4LndpbmRvdy5zaWRlY2FyLlNpZGVjYXJEZXZpY2VTdGF0ZSk7CiAgcHVibGljICoqKiBvbldpbmRvd0xheW91dENoYW5nZWQoYW5kcm9pZC5vcy5JQmluZGVyLCBhbmRyb2lkeC53aW5kb3cuc2lkZWNhci5TaWRlY2FyV2luZG93TGF5b3V0SW5mbyk7Cn0YASIGCA0QEhgBKgoSAhYXIgQWFxgZam8IBRJfLWlmIGludGVyZmFjZSAqIHsgQHJldHJvZml0Mi5odHRwLiogPG1ldGhvZHM+OyB9Ci1rZWVwLGFsbG93b2JmdXNjYXRpb24gaW50ZXJmYWNlICogZXh0ZW5kcyA8MT4YAiIGCA4QIxgBKgBqaAgGElUtaWYgaW50ZXJmYWNlICogeyBAcmV0cm9maXQyLmh0dHAuKiA8bWV0aG9kcz47IH0KLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBpbnRlcmZhY2UgPDE+GAIiBggOEB8YASoDEgEYaogBCAcSei1pZiBpbnRlcmZhY2UgKiB7IEByZXRyb2ZpdDIuaHR0cC4qIHB1YmxpYyAqKiogKiguLi4pOyB9Ci1rZWVwLGFsbG93b3B0aW1pemF0aW9uLGFsbG93c2hyaW5raW5nLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgPDM+IgYIDhAsGAEqAGqoAQgIEo0BLWlmIHB1YmxpYyBjbGFzcyAqKiBleHRlbmRzIGFuZHJvaWR4LmZyYWdtZW50LmFwcC5GcmFnbWVudAota2VlcGNsYXNzZXN3aXRobWVtYmVycyxhbGxvd29iZnVzY2F0aW9uIHB1YmxpYyBjbGFzcyA8MT4gewogICAgcHVibGljIDxpbml0PigpOwp9GAIiBggSEBAYASoKEgMZGhsiAxobHGqcAggJEosCLWlmIHB1YmxpYyBjbGFzcyBhbmRyb2lkeC5jb21wb3NlLnVpLnBsYXRmb3JtLkFuZHJvaWRDb21wb3NpdGlvbkxvY2Fsc19hbmRyb2lkS3QgewogICAgcHVibGljIHN0YXRpYyAqKiogZ2V0TG9jYWxMaWZlY3ljbGVPd25lcigpOwp9Ci1rZWVwIHB1YmxpYyBjbGFzcyBhbmRyb2lkeC5jb21wb3NlLnVpLnBsYXRmb3JtLkFuZHJvaWRDb21wb3NpdGlvbkxvY2Fsc19hbmRyb2lkS3QgewogICAgcHVibGljIHN0YXRpYyAqKiogZ2V0TG9jYWxMaWZlY3ljbGVPd25lcigpOwp9GAEiBggTEA0YASoAaq4CCAoSnQItaWYgcHVibGljIGNsYXNzIGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uQW5kcm9pZENvbXBvc2l0aW9uTG9jYWxzX2FuZHJvaWRLdCB7CiAgICBwdWJsaWMgc3RhdGljICoqKiBnZXRMb2NhbFNhdmVkU3RhdGVSZWdpc3RyeU93bmVyKCk7Cn0KLWtlZXAgcHVibGljIGNsYXNzIGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uQW5kcm9pZENvbXBvc2l0aW9uTG9jYWxzX2FuZHJvaWRLdCB7CiAgICBwdWJsaWMgc3RhdGljICoqKiBnZXRMb2NhbFNhdmVkU3RhdGVSZWdpc3RyeU93bmVyKCk7Cn0YASIGCBQQDRgBKgBqQwgLEjMta2VlcCBAYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uS2VlcCBjbGFzcyAqIHsqO30YASIGCBUQRhgBKgBqUQgMEicta2VlcCBAYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwIGNsYXNzICoYASIGCCIQLBgBKhoKAQ0SFRwdHh8gISIjJCUmJygpKissLS4vMGqXAggNEiwta2VlcCBAYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwIGNsYXNzICogeyo7fRgBIgYIIxACGAEq2gESFRwdHh8gISIjJCUmJygpKissLS4vMBo5FhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OIoUBHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAWrzAQgOEm8ta2VlcCBAY29tLmdvb2dsZS5hbmRyb2lkLmdtcy5jb21tb24udXRpbC5EeW5hbWl0ZUFwaSBwdWJsaWMgY2xhc3MgKiB7CiAgcHVibGljIDxmaWVsZHM+OwogIHB1YmxpYyA8bWV0aG9kcz47Cn0YASIGCCIQRxgBKnQSAzEyMxoDT1BRImiRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAWpACA8SMC1rZWVwIEBpbnRlcmZhY2UgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uS2VlcBgBIgYIIhArGAEqAGo8CBASKS1rZWVwIEBpbnRlcmZhY2UgYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwGAEiBggiEDUYASoDEgE0alUIERJCLWtlZXAgQGludGVyZmFjZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ21zLmNvbW1vbi5hbm5vdGF0aW9uLktlZXBOYW1lGAEiBggiED8YASoDEgE1alIIEhI/LWtlZXAgQGludGVyZmFjZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ21zLmNvbW1vbi51dGlsLkR5bmFtaXRlQXBpGAEiBggiEEYYASoDEgE2amMIExJDLWtlZXAgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWR4LnJvb20uUm9vbURhdGFiYXNlIHsgdm9pZCA8aW5pdD4oKTsgfRgBIgYIKRABGAEqEBIENzg5OiIIxQHGAccByAFqxwEIFBKgAS1rZWVwIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC5zdGFydHVwLkluaXRpYWxpemVyIHsKICAgICMgS2VlcCB0aGUgcHVibGljIG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yIHdoaWxlIGFsbG93aW5nIG90aGVyIG1ldGhvZHMgdG8gYmUgb3B0aW1pemVkLgogICAgPGluaXQ+KCk7Cn0YASIGCC8QBxgBKhYSBjs8PT4/QCIMyQHKAcsBzAHNAc4BamEIFRJRLWtlZXAgY2xhc3MgKiBpbXBsZW1lbnRzIGFuZHJvaWR4LmxpZmVjeWNsZS5HZW5lcmF0ZWRBZGFwdGVyIHsKICAgIDxpbml0PiguLi4pOwp9GAEiBggwEAoYASoAal4IFhJJLWtlZXAgY2xhc3MgKiBpbXBsZW1lbnRzIGFuZHJvaWR4LnZlcnNpb25lZHBhcmNlbGFibGUuVmVyc2lvbmVkUGFyY2VsYWJsZRgBIgYIMxABGAEqBRIDQUJDanAIFxJXLWtlZXAgY2xhc3MgKiBpbXBsZW1lbnRzIGNvbS5leGFtcGxlLm15bGlicmFyeS5TdGFydHVwVGFzayB7CiAgICA8aW5pdD4oKTsKICAgIHJ1bigpOwp9GAEiBgg1EAYYASoJEgFEIgTPAdABanQIGBJKLWtlZXAgY2xhc3MgKiBpbXBsZW1lbnRzIGNvbS5nb29nbGUuZmlyZWJhc2UuY29tcG9uZW50cy5Db21wb25lbnRSZWdpc3RyYXIYASIGCDYQBBgBKhoSGB1FHh9GRyAhIkgjSSQlSiZLJygqLS4vMGo7CBkSKy1rZWVwIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLktlZXAYASIGCBUQRBgBKgBqPQgaEiota2VlcCBjbGFzcyBhbmRyb2lkeC53b3JrLldvcmtlclBhcmFtZXRlcnMYASIGCDcQChgBKgMSAUxqWQgbEkYta2VlcCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ21zLmNvbW1vbi5pbnRlcm5hbC5SZWZsZWN0ZWRQYXJjZWxhYmxlGAEiBggiECQYASoDEgFNanEIHBI7LWtlZXAgaW50ZXJmYWNlIGFuZHJvaWR4LndpbmRvdy5hcmVhLnJlZmxlY3Rpb25ndWFyZC4qIHsqO30YASIGCA0QGxgBKiMSA05PUCIc0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeATIBAGppCB0SUi1rZWVwIGludGVyZmFjZSBhbmRyb2lkeC53aW5kb3cucmVmbGVjdGlvbi5Db25zdW1lcjIgewogIHB1YmxpYyAqKiogYWNjZXB0KCoqKik7Cn0YASIGCA0QIBgBKgcSAVEiAt8BamkIHhJSLWtlZXAgaW50ZXJmYWNlIGFuZHJvaWR4LndpbmRvdy5yZWZsZWN0aW9uLkpGdW5jdGlvbjIgewogIHB1YmxpYyAqKiogYXBwbHkoKioqKTsKfRgBIgYIDRAmGAEqBxIBUiIC4AFqaAgfElEta2VlcCBpbnRlcmZhY2UgYW5kcm9pZHgud2luZG93LnJlZmxlY3Rpb24uUHJlZGljYXRlMiB7CiAgcHVibGljICoqKiB0ZXN0KCoqKik7Cn0YASIGCA0QIxgBKgcSAVMiAuEBalgIIBI2LWtlZXAgcHVibGljIGNsYXNzIGFuZHJvaWQuc3VwcG9ydC4qKlBhcmNlbGl6ZXIgeyAqOyB9GAEiBggzEAIYASoSEgJUVSIM4gHjAeQB5QHmAecBalEIIRIvLWtlZXAgcHVibGljIGNsYXNzIGFuZHJvaWR4LioqUGFyY2VsaXplciB7ICo7IH0YASIGCDMQAxgBKhISAlZXIgzoAekB6gHrAewB7QFqTQgiEjota2VlcCBwdWJsaWMgY2xhc3MgYW5kcm9pZHgudmVyc2lvbmVkcGFyY2VsYWJsZS5QYXJjZWxJbXBsGAEiBggzEAQYASoDEgFYalIIIxJCLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLnZlbmRpbmcubGljZW5zaW5nLklMaWNlbnNpbmdTZXJ2aWNlGAEiBggVEBYYASoAalkIJBJJLWtlZXAgcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC52ZW5kaW5nLmxpY2Vuc2luZy5JTGljZW5zaW5nU2VydmljZRgBIgYIFRAXGAEqAGpRCCUSQS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLnZlbmRpbmcubGljZW5zaW5nLklMaWNlbnNpbmdTZXJ2aWNlGAEiBggVEBUYASoAak0IJhI6LWtlZXAsYWxsb3dvYmZ1c2NhdGlvbiBAaW50ZXJmYWNlIGFuZHJvaWR4LmFubm90YXRpb24uS2VlcBgCIgYIIxABGAEqAxIBNGpgCCcSRS1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgQGRhZ2dlci5oaWx0LkVudHJ5UG9pbnQgY2xhc3MgKhgDIgYIOhADGAEqCxIJWVpbXF1eX2BhamIIKBJSLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBAZGFnZ2VyLmhpbHQuYW5kcm9pZC5FYXJseUVudHJ5UG9pbnQgY2xhc3MgKhgDIgYIOhAHGAEqAGpnCCkSVy1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgQGRhZ2dlci5oaWx0LmludGVybmFsLkNvbXBvbmVudEVudHJ5UG9pbnQgY2xhc3MgKhgDIgYIOhAFGAEqAGpsCCoSVy1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgQGRhZ2dlci5oaWx0LmludGVybmFsLkdlbmVyYXRlZEVudHJ5UG9pbnQgY2xhc3MgKhgDIgYIOhAGGAEqBRIDYmNkaoMCCCsSYi1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWR4LmNvbXBvc2UudWkubm9kZS5Nb2RpZmllck5vZGVFbGVtZW50GAMiBghEECEYASqQARKNAWVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AWp6CCwSZi1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgY29tLmdvb2dsZS5zYW1wbGVzLmFwcHMubm93aW5hbmRyb2lkLk1haW5BY3Rpdml0eVZpZXdNb2RlbBgDIgYIRhABGAEqBBICuQFqjgEILRJ6LWtlZXAsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBjb20uZ29vZ2xlLnNhbXBsZXMuYXBwcy5ub3dpbmFuZHJvaWQuZmVhdHVyZS5ib29rbWFya3MuaW1wbC5Cb29rbWFya3NWaWV3TW9kZWwYAyIGCEgQARgBKgQSAroBaogBCC4SdC1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgY29tLmdvb2dsZS5zYW1wbGVzLmFwcHMubm93aW5hbmRyb2lkLmZlYXR1cmUuZm9yeW91LmltcGwuRm9yWW91Vmlld01vZGVsGAMiBghKEAEYASoEEgK7AWqOAQgvEnota2VlcCxhbGxvd29iZnVzY2F0aW9uLGFsbG93c2hyaW5raW5nIGNsYXNzIGNvbS5nb29nbGUuc2FtcGxlcy5hcHBzLm5vd2luYW5kcm9pZC5mZWF0dXJlLmludGVyZXN0cy5pbXBsLkludGVyZXN0c1ZpZXdNb2RlbBgDIgYITBABGAEqBBICvAFqiAEIMBJ0LWtlZXAsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBjb20uZ29vZ2xlLnNhbXBsZXMuYXBwcy5ub3dpbmFuZHJvaWQuZmVhdHVyZS5zZWFyY2guaW1wbC5TZWFyY2hWaWV3TW9kZWwYAyIGCE4QARgBKgQSAr0BaowBCDESeC1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgY29tLmdvb2dsZS5zYW1wbGVzLmFwcHMubm93aW5hbmRyb2lkLmZlYXR1cmUuc2V0dGluZ3MuaW1wbC5TZXR0aW5nc1ZpZXdNb2RlbBgDIgYIUBABGAEqBBICvgFqhgEIMhJyLWtlZXAsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBjb20uZ29vZ2xlLnNhbXBsZXMuYXBwcy5ub3dpbmFuZHJvaWQuZmVhdHVyZS50b3BpYy5pbXBsLlRvcGljVmlld01vZGVsGAMiBghSEAEYASoEEgK/AWpeCDMSSi1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3Mga290bGluLmNvcm91dGluZXMuQ29udGludWF0aW9uGAMiBggOECkYASoEEgLAAWpSCDQSPi1rZWVwLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgcmV0cm9maXQyLlJlc3BvbnNlGAMiBggOEDAYASoEEgLBAWq2AQg1Ep0BLWtlZXAsYWxsb3dzaHJpbmtpbmcgY2xhc3MgYW5kcm9pZHgud2luZG93LmxheW91dC5hZGFwdGVyLmV4dGVuc2lvbnMuTXVsdGljYXN0Q29uc3VtZXIgewogIHZvaWQgYWNjZXB0KGFuZHJvaWR4LndpbmRvdy5leHRlbnNpb25zLmxheW91dC5XaW5kb3dMYXlvdXRJbmZvKTsKfRgEIgYIDRAdGAEqCBICwgEiAu4BamQINhJQLWtlZXAsYWxsb3dzaHJpbmtpbmcgaW50ZXJmYWNlIGNvbS5nb29nbGUuZmlyZWJhc2UuY29tcG9uZW50cy5Db21wb25lbnRSZWdpc3RyYXIYBCIGCDYQBRgBKgQSAsMBaogBCDcSVi1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJuYW1lcyxpbmNsdWRlZGVzY3JpcHRvcmNsYXNzZXMgY2xhc3MgKiB7CiAgICBuYXRpdmUgPG1ldGhvZHM+Owp9GAQiBggVEB0YASoiEgbEAcUBxgEiGO8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AWqRAQg4EoABLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcm5hbWVzLGluY2x1ZGVkZXNjcmlwdG9yY2xhc3NlcyBjbGFzcyBhbmRyb2lkeC5kYXRhc3RvcmUuY29yZS5OYXRpdmVTaGFyZWRDb3VudGVyIHsKICAgIG5hdGl2ZSA8bWV0aG9kcz47Cn0YBCIGCFcQBxgBKgBqYgg5ElIta2VlcGNsYXNzZXN3aXRobWVtYmVycyBjbGFzcyAqIHsKICAgIEBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5LZWVwIDxmaWVsZHM+Owp9GAEiBggVEEwYASoAamUIOhJVLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiB7CiAgICBAYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uS2VlcCA8aW5pdD4oLi4uKTsKfRgBIgYIFRBQGAEqAGpjCDsSUy1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJzIGNsYXNzICogewogICAgQGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLktlZXAgPG1ldGhvZHM+Owp9GAEiBggVEEgYASoAal4IPBJOLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiB7CiAgICBAYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwIDxpbml0PiguLi4pOwp9GAEiBggjEAwYASoAanIIPRJJLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiB7CiAgQGFuZHJvaWR4LmFubm90YXRpb24uS2VlcCA8ZmllbGRzPjsKfRgBIgYIIhAtGAEqGRIExwHIARoRUlNUVVZXWFlaW1xdXl9gYWJq3wEIPhJKLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiB7CiAgQGFuZHJvaWR4LmFubm90YXRpb24uS2VlcCA8bWV0aG9kcz47Cn0YASIGCCIQMBgBKoQBEhfJAcoBywEfzAEmKM0ByAHOAc8B0AHRASJp+wH8Af0B/gH/AYACgQKCAoMChAKFAoYChwKIAokCigKLAowCjQIljgI4PY8CkAKRApICkwKUApUClgKXApgCmQKaApsCnAKdAp4CnwKgAqECogKjAqQCpQKmAqcCqAKpAqoCqwKsAq0CanwIPxJRLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgYW5kcm9pZHguZ3JhcGhpY3MucGF0aC4qKiB7CiAgICBuYXRpdmUgPG1ldGhvZHM+Owp9GAEiBghZEAEYASoYEgTEAcUBIhDvAfAB8QHyAfMB9AH1AfYBMgEAaogBCEAScC1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJzLGFsbG93b2JmdXNjYXRpb24gcHVibGljIGNsYXNzIGFuZHJvaWR4LmxpZmVjeWNsZS5SZXBvcnRGcmFnbWVudCB7CiAgICBwdWJsaWMgPGluaXQ+KCk7Cn0YAiIGCDAQFBgBKggSAtIBIgKuAmppCEESWS1rZWVwY2xhc3NtZW1iZXJuYW1lcyBjbGFzcyAqIHsKICBAY29tLmdvb2dsZS5hbmRyb2lkLmdtcy5jb21tb24uYW5ub3RhdGlvbi5LZWVwTmFtZSAqOwp9GAQiBggiEEEYASoAaq8BCEISjAEta2VlcGNsYXNzbWVtYmVybmFtZXMsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBhbmRyb2lkeC5hcHBjb21wYXQud2lkZ2V0LkFwcENvbXBhdFRleHRWaWV3QXV0b1NpemVIZWxwZXIkSW1wbCogewogIDxtZXRob2RzPjsKfRgDIgYIXBAQGAEqEiIQrwKwArECsgKzArQCtQK2AmqiAQhDEnwta2VlcGNsYXNzbWVtYmVybmFtZXMsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBhbmRyb2lkeC5jb3JlLmFwcC5Ob3RpZmljYXRpb25Db21wYXQkKiRBcGkqSW1wbCB7CiAgPG1ldGhvZHM+Owp9GAMiBghdEAgYASoWIhS3ArgCuQK6ArsCvAK9Ar4CvwLAAmqHAQhEEncta2VlcGNsYXNzbWVtYmVybmFtZXMsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBhbmRyb2lkeC5jb3JlLm9zLlVzZXJIYW5kbGVDb21wYXQkQXBpKkltcGwgewogIDxtZXRob2RzPjsKfRgDIgYIXRALGAEqAGq/AQhFEm8ta2VlcGNsYXNzbWVtYmVybmFtZXMsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBhbmRyb2lkeC5jb3JlLnZpZXcuVmlld0NvbXBhdCRBcGkqIHsKICA8bWV0aG9kcz47Cn0YAyIGCF0QAhgBKkAiPsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8CaukCCEYSeS1rZWVwY2xhc3NtZW1iZXJuYW1lcyxhbGxvd29iZnVzY2F0aW9uLGFsbG93c2hyaW5raW5nIGNsYXNzIGFuZHJvaWR4LmNvcmUudmlldy5XaW5kb3dJbnNldHNDb21wYXQkKkltcGwqIHsKICA8bWV0aG9kcz47Cn0YAyIGCF0QBRgBKt8BItwB4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AoADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA2qVAQhHEnsta2VlcGNsYXNzbWVtYmVybmFtZXMsYWxsb3dvYmZ1c2NhdGlvbixhbGxvd3Nocmlua2luZyBjbGFzcyBhbmRyb2lkeC5jb3JlLndpZGdldC5FZGdlRWZmZWN0Q29tcGF0JEFwaSpJbXBsIHsKICA8bWV0aG9kcz47Cn0YAyIGCF0QDhgBKgoiCM4DzwPQA9EDargBCEgSmAEta2VlcGNsYXNzbWVtYmVycyBAa290bGlueC5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZSBjbGFzcyAqKiB7CiAgICBwdWJsaWMgc3RhdGljICoqIElOU1RBTkNFOwogICAga290bGlueC5zZXJpYWxpemF0aW9uLktTZXJpYWxpemVyIHNlcmlhbGl6ZXIoLi4uKTsKfRgBIgYIChAWGAEqDwoBAhoEEhMUFSIEAAECA2p2CEkSYC1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkLmFwcC5BY3Rpdml0eSB7CiAgICBwdWJsaWMgdm9pZCAqKGFuZHJvaWQudmlldy5WaWV3KTsKfRgBIgYIFRAoGAEqBiIE0gPTA2qeAQhKEnAta2VlcGNsYXNzbWVtYmVycyBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZHguZGF0YXN0b3JlLnByZWZlcmVuY2VzLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlIHsKICAgIDxmaWVsZHM+Owp9GAEiBghhEAEYASoeGhxjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+apQBCEsSWy1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC5saWZlY3ljbGUuRW1wdHlBY3Rpdml0eUxpZmVjeWNsZUNhbGxiYWNrcyB7ICo7IH0YASIGCGIQAhgBKikaA3+AASIi1APVA9YD1wPYA9kD2gPbA9wD3QPeA98D4APhA+ID4wPkA2piCEwSTi1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC53b3JrLklucHV0TWVyZ2VyIHsgdm9pZCA8aW5pdD4oKTsgfRgBIgYINxAPGAEqBCIC5QNqhgYITRJiLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgKiBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5nbXMuaW50ZXJuYWwubWVhc3VyZW1lbnQuenpqdCB7CiAgPGZpZWxkcz47Cn0YASIGCGQQBBgBKpMFGpAFgQGCAYMBhAGF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AQhTEq0BLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgYW5kcm9pZHguY29tcG9zZS51aS5ncmFwaGljcy5sYXllci52aWV3LlBsYWNlaG9sZGVySGFyZHdhcmVDYW52YXMgewogICAgcHVibGljIGludCBkcmF3UmVuZGVyTm9kZSguLi4pOwogICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCk7Cn0YASIGCG0QHBgBKgBqmAEIVBKDAS1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIGFuZHJvaWR4LmNvbXBvc2UudWkuZ3JhcGhpY3MubGF5ZXIudmlldy5WaWV3TGF5ZXJDb250YWluZXIgewogICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hHZXREaXNwbGF5TGlzdCgpOwp9GAEiBghtEBkYASoEIgLmA2qfAQhVEooBLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgYW5kcm9pZHguY29tcG9zZS51aS5wbGF0Zm9ybS5BbmRyb2lkQ29tcG9zZVZpZXcgewogICAgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZFRyYXZlcnNhbChpbnQpOwp9GAEiBghEEBoYASoEIgLnA2qIAQhWEngta2VlcGNsYXNzbWVtYmVycyBjbGFzcyBhbmRyb2lkeC5jb21wb3NlLnVpLnBsYXRmb3JtLlZpZXdMYXllckNvbnRhaW5lciB7CiAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaEdldERpc3BsYXlMaXN0KCk7Cn0YASIGCEQQFhgBKgBqhwEIVxJTLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgYW5kcm9pZHgubGlmZWN5Y2xlLlJlcG9ydEZyYWdtZW50JExpZmVjeWNsZUNhbGxiYWNrcyB7ICo7IH0YASIGCDAQGhgBKiQaArsFIh7oA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gNqhwIIWBLsAS1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIGFuZHJvaWR4LnRyYWNpbmcucGVyZmV0dG8uam5pLlBlcmZldHRvTmF0aXZlIHsKICAgIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlVmVyc2lvbigpOwogICAgdm9pZCBuYXRpdmVSZWdpc3RlcldpdGhQZXJmZXR0bygpOwogICAgdm9pZCBuYXRpdmVUcmFjZUV2ZW50QmVnaW4oaW50LCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgIHZvaWQgbmF0aXZlVHJhY2VFdmVudEVuZCgpOwp9GAEiBghvEAIYASoKIgj3AfgB+QH6AWrAAQhZEqsBLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgYW5kcm9pZHgudHJhbnNpdGlvbi5DaGFuZ2VCb3VuZHMkKiBleHRlbmRzIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIHsKICBhbmRyb2lkeC50cmFuc2l0aW9uLkNoYW5nZUJvdW5kcyRWaWV3Qm91bmRzIG1WaWV3Qm91bmRzOwp9GAEiBghxEBAYASoEGgK8BWriAQhaEn4ta2VlcGNsYXNzbWVtYmVycyBjbGFzcyBhbmRyb2lkeC52ZWN0b3JkcmF3YWJsZS5ncmFwaGljcy5kcmF3YWJsZS5WZWN0b3JEcmF3YWJsZUNvbXBhdCQqIHsKICAgdm9pZCBzZXQqKCoqKik7CiAgICoqKiBnZXQqKCk7Cn0YASIGCHMQEBgBKlQiUvcD+AP5A/oD+wP8A/0D/gP/A4AEgQSCBIMEhASFBIYEhwSIBIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwRq0gEIWxLBAS1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nbXMuY29tbW9uLmFwaS5pbnRlcm5hbC5CYXNlUGVuZGluZ1Jlc3VsdCB7CiAgY29tLmdvb2dsZS5hbmRyb2lkLmdtcy5jb21tb24uYXBpLmludGVybmFsLkJhc2VQZW5kaW5nUmVzdWx0JFJlbGVhc2FibGVSZXN1bHRHdWFyZGlhbiBtUmVzdWx0R3VhcmRpYW47Cn0YASIGCHQQAhgBKgBqaQhcElUta2VlcGNsYXNzbWVtYmVycyBjbGFzcyBrb3RsaW4uY29yb3V0aW5lcy5TYWZlQ29udGludWF0aW9uIHsKICAgIHZvbGF0aWxlIDxmaWVsZHM+Owp9GAEiBgh1EAsYASoEGgK9BWrcAQhdEkgta2VlcGNsYXNzbWVtYmVycyBjbGFzcyBrb3RsaW54LmNvcm91dGluZXMuKiogewogICAgdm9sYXRpbGUgPGZpZWxkcz47Cn0YASIGCHUQBhgBKoABGn6+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwXQBdEF0gXTBdQF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AUyAQBq4QYIXhJtLWtlZXBjbGFzc21lbWJlcnMgZW51bSAqIHsKICAgIHB1YmxpYyBzdGF0aWMgKipbXSB2YWx1ZXMoKTsKICAgIHB1YmxpYyBzdGF0aWMgKiogdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKfRgBIgYIFRAtGAEq4wUi4AWgBKEEogSjBKQEpQSmBKcEqASpBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBBMIEwwTEBMUExgTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBOYE5wToBOkE6gTrBOwE7QTuBO8E8ATxBPIE8wT0BPUE9gT3BPgE+QT6BPsE/AT9BP4E/wSABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8FgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0GngafBqAGoQaiBqMGpAalBqYGpwaoBqkGqgarBqwGrQauBq8GsAaxBrIGswa0BrUGtga3BrgGuQa6BrsGvAa9Br4GvwbABsEGwgbDBsQGxQbGBscGyAbJBsoGywbMBs0GzgbPBtAG0QbSBtMG1AbVBtYG1wbYBtkG2gbbBtwG3QbeBt8G4AbhBuIG4wbkBuUG5gbnBugG6QbqBusG7AbtBu4G7wbwBvEG8gbzBvQG9Qb2BvcG+Ab5BvoG+wb8Bv0G/gb/BoAHgQeCB4MHhAeFB4YHhweIB4kHigeLB4wHjQeOB48HanEIXxJLLWtlZXBjbGFzc21lbWJlcnMgZW51bSBhbmRyb2lkeC5saWZlY3ljbGUuTGlmZWN5Y2xlJEV2ZW50IHsKICAgIDxmaWVsZHM+Owp9GAEiBggwEAYYASoWGhT9Bf4F/wWABoEGggaDBoQGhQaGBmq6CQhgEmIta2VlcGNsYXNzbWVtYmVycyBwdWJsaWMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3IHsKICAgIHZvaWQgc2V0KigqKiopOwogICAgKioqIGdldCooKTsKfRgBIgYIFRAiGAEqxwgixAiQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeuB68HsAexB7IHswe0B7UHtge3B7gHuQe6B7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfVB9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfzB/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/B4AIgQiCCIMIhAiFCIYIhwiICIkIigiLCIwIjQiOCI8IkAiRCJIIkwiUCJUIlgiXCJgImQiaCJsInAidCJ4InwigCKEIogijCKQIpQimCKcIqAipCKoIqwisCK0IrgivCLAIsQiyCLMItAi1CLYItwi4CLkIugi7CLwIvQi+CL8IwAjBCMIIwwjECMUIxgjHCMgIyQjKCMsIzAjNCM4IzwjQCNEI0gjTCNQI1QjWCNcI2AjZCNoI2wjcCN0I3gjfCOAI4QjiCOMI5AjlCOYI5wjoCOkI6gjrCOwI7QjuCO8I8AjxCPII8wj0CPUI9gj3CPgI+Qj6CPsI/Aj9CP4I/wiACYEJggmDCYQJhQmGCYcJiAmJCYoJiwmMCY0JjgmPCZAJkQmSCZMJlAmVCZYJlwmYCZkJmgmbCZwJnQmeCZ8JoAmhCaIJowmkCaUJpgmnCagJqQmqCasJrAmtCa4JrwmwCbEJsgmzCbQJtQm2CbcJuAm5CboJuwm8Cb0Jvgm/CcAJwQnCCcMJxAnFCcYJxwnICckJygnLCcwJzQnOCc8J0AnRCdIJ0wnUCdUJ1gnXCdgJ2QnaCdsJ3AndCd4J3wngCeEJ4gnjCeQJ5QnmCecJ6AnpCeoJ6wnsCe0J7gnvCfAJ8QnyCfMJ9An1CfYJ9wn4CfkJ+gn7CfwJ/Qn+Cf8JgAqBCoIKgwqECoUKhgqHCogKiQqKCosKjAqNCo4KjwqQCpEKkgqTCpQKlQqWCpcKmAqZCpoKmwqcCp0KngqfCqAKoQqiCqMKpAqlCqYKpwqoCqkKqgqrCqwKrQquCq8KsAqxCrIKswq0CrUKtgq3CrgKuQq6CrsKvAq9Cr4KvwrACsEKwgrDCsQKxQrGCscKyArJCsoKywrMCs0KzgrPCtAK0QrSCtMK1ArVCtYK1wrYCtkK2grbCtwK3QreCt8K4ArhCuIK4wrkCuUK5grnCugK6QrqCusK7ArtCu4K7wrwCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CoALgQuCC4MLhAuFC4YLhwuIC4kLiguLC4wLjQuOC48LkAuRC5ILkwuUC5ULlguXC5gLmQuaC5sLnAudC54LnwugC6ELogujC6QLpQumC6cLqAupC6oLqwusC60LrguvC7ALsQtqgQEIYRJjLWtlZXBjbGFzc21lbWJlcnMgcHVibGljIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC53b3JrLkxpc3RlbmFibGVXb3JrZXIgewogICAgcHVibGljIDxpbml0PiguLi4pOwp9GAEiBgg3EAQYASoOIgyyC7MLtAu1C7YLtwtqbAhiEkwta2VlcGNsYXNzbWVtYmVycyBwdWJsaWMgY2xhc3MgKiokJHNlcmlhbGl6ZXIgewogICAgcHJpdmF0ZSAqKiBkZXNjcmlwdG9yOwp9GAEiBggLECcYASoQGg6HBogGiQaKBosGjAaNBmqWAQhjEoUBLWtlZXBjbGFzc21lbWJlcnMgcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nbXMuY29tbW9uLmludGVybmFsLnNhZmVwYXJjZWwuU2FmZVBhcmNlbGFibGUgewogICAgcHVibGljIHN0YXRpYyBmaW5hbCAqKiogTlVMTDsKfRgBIgYIIhAeGAEqAGqQAQhkEn8ta2VlcGNsYXNzbWVtYmVycyxhbGxvd29iZnVzY2F0aW9uIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC5saWZlY3ljbGUuQW5kcm9pZFZpZXdNb2RlbCB7CiAgICA8aW5pdD4oYW5kcm9pZC5hcHAuQXBwbGljYXRpb24pOwp9GAIiBwiKARAFGAEqAGq1AQhlEqMBLWtlZXBjbGFzc21lbWJlcnMsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZHgubGlmZWN5Y2xlLkFuZHJvaWRWaWV3TW9kZWwgewogICAgPGluaXQ+KGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uLGFuZHJvaWR4LmxpZmVjeWNsZS5TYXZlZFN0YXRlSGFuZGxlKTsKfRgCIgcIiwEQBRgBKgBqfAhmEmEta2VlcGNsYXNzbWVtYmVycyxhbGxvd29iZnVzY2F0aW9uIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC5saWZlY3ljbGUuVmlld01vZGVsIHsKICAgIDxpbml0PigpOwp9GAIiBwiKARABGAEqCiIIuAu5C7oLuwtqlgEIZxKEAS1rZWVwY2xhc3NtZW1iZXJzLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgKiBleHRlbmRzIGFuZHJvaWR4LmxpZmVjeWNsZS5WaWV3TW9kZWwgewogICAgPGluaXQ+KGFuZHJvaWR4LmxpZmVjeWNsZS5TYXZlZFN0YXRlSGFuZGxlKTsKfRgCIgcIiwEQARgBKgBqkQEIaBJ8LWtlZXBjbGFzc21lbWJlcnMsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyAqIGltcGxlbWVudHMgYW5kcm9pZHguc2F2ZWRzdGF0ZS5TYXZlZFN0YXRlUmVnaXN0cnkkQXV0b1JlY3JlYXRlZCB7CiAgICA8aW5pdD4oKTsKfRgCIgcIjgEQDxgBKgQiArwLarACCGkSXC1rZWVwY2xhc3NtZW1iZXJzLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgKiB7CiAgQGFuZHJvaWR4LmFubm90YXRpb24uRG9Ob3RJbmxpbmUgPG1ldGhvZHM+Owp9GAIiBggjEBAYASrDASLAAb0Lvgu/C8ALwQvCC8MLxAvFC8YLxwvIC8kLygvLC8wLzQvOC88L0AvRC9IL0wvUC9UL1gvXC9gL2QvaC9sL3AvdC94L3wvgC+EL4gvjC+QL5QvmC+cL6AvpC+oL6wvsC+0L7gvvC/AL8QvyC/ML9Av1C/YL9wv4C/kL+gv7C/wL/Qv+C/8LgAyBDIIMgwyEDIUMhgyHDIgMiQyKDIsMjAyNDI4MjwyQDJEMkgyTDJQMlQyWDJcMmAyZDJoMmwycDGqbAghqEssBLWtlZXBjbGFzc21lbWJlcnMsYWxsb3dzaHJpbmtpbmcsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBhbmRyb2lkeC5jb21wb3NlLioqLiogewogICAgc3RhdGljIHZvaWQgdGhyb3cqRXhjZXB0aW9uKC4uLik7CiAgICAjIEZvciBtZXRob2RzIHJldHVybmluZyBOb3RoaW5nCiAgICBzdGF0aWMgamF2YS5sYW5nLlZvaWQgdGhyb3cqRXhjZXB0aW9uKC4uLik7Cn0YAyIHCJcBEBIYASo+CgJrbCI4nQyeDJ8MoAyhDKIMowykDKUMpgynDKgMqQyqDKsMrAytDK4MrwywDLEMsgyzDLQMtQy2DLcMuAxqoQQIaxLIAy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93c2hyaW5raW5nLGFsbG93b2JmdXNjYXRpb24gY2xhc3MgYW5kcm9pZHguY29tcG9zZS4qKi4qIHsKICAgIHN0YXRpYyB2b2lkIHRocm93KkV4Y2VwdGlvbiguLi4pOwogICAgc3RhdGljIHZvaWQgdGhyb3cqRXhjZXB0aW9uRm9yTnVsbENoZWNrKC4uLik7CiAgICAjIEZvciBtZXRob2RzIHJldHVybmluZyBOb3RoaW5nCiAgICBzdGF0aWMgamF2YS5sYW5nLlZvaWQgdGhyb3cqRXhjZXB0aW9uKC4uLik7CiAgICBzdGF0aWMgamF2YS5sYW5nLlZvaWQgdGhyb3cqRXhjZXB0aW9uRm9yTnVsbENoZWNrKC4uLik7CiAgICAjIEZvciBmdW5jdGlvbnMgZ2VuZXJhdGluZyBlcnJvciBtZXNzYWdlcwogICAgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSooLi4uKTsKICAgIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSooLi4uKTsKfRgDIgYIRBAmGAEqSCJGnQyeDJ8MuQygDLoMoQyiDKMMpAylDKYMpwyoDKkMqgyrDKwMrQyuDLsMrwy8DLAMvQyxDL4Msgy/DLMMtAy1DLYMtwy4DGqUAwhsErkCLWtlZXBjbGFzc21lbWJlcnMsYWxsb3dzaHJpbmtpbmcsYWxsb3dvYmZ1c2NhdGlvbiBjbGFzcyBhbmRyb2lkeC5jb21wb3NlLioqLiogewogICAgc3RhdGljIHZvaWQgdGhyb3cqRXhjZXB0aW9uKC4uLik7CiAgICBzdGF0aWMgdm9pZCB0aHJvdypFeGNlcHRpb25Gb3JOdWxsQ2hlY2soLi4uKTsKICAgICMgRm9yIG1ldGhvZHMgcmV0dXJuaW5nIE5vdGhpbmcKICAgIHN0YXRpYyBqYXZhLmxhbmcuVm9pZCB0aHJvdypFeGNlcHRpb24oLi4uKTsKICAgIHN0YXRpYyBqYXZhLmxhbmcuVm9pZCB0aHJvdypFeGNlcHRpb25Gb3JOdWxsQ2hlY2soLi4uKTsKfRgDIgcImAEQEhgBKkkKAWsiRJ0MngyfDLkMoAy6DKEMogyjDKQMpQymDKcMqAypDKoMqwysDK0Mrgy7DK8MvAywDLEMvgyyDL8Mswy0DLUMtgy3DLgMaugECG0SwAQta2VlcGNsYXNzbWVtYmVycyxhbGxvd3Nocmlua2luZyxhbGxvd29iZnVzY2F0aW9uIGNsYXNzIGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS4qKiB7CiAgICAjIGphdmEubGFuZy5Wb2lkID09IG1ldGhvZHMgdGhhdCByZXR1cm4gTm90aGluZwogICAgc3RhdGljIHZvaWQgdGhyb3cqRXhjZXB0aW9uKC4uLik7CiAgICBzdGF0aWMgdm9pZCB0aHJvdypFeGNlcHRpb25Gb3JOdWxsQ2hlY2soLi4uKTsKICAgIHN0YXRpYyBqYXZhLmxhbmcuVm9pZCB0aHJvdypFeGNlcHRpb24oLi4uKTsKICAgIHN0YXRpYyBqYXZhLmxhbmcuVm9pZCB0aHJvdypFeGNlcHRpb25Gb3JOdWxsQ2hlY2soLi4uKTsKCiAgICAjIEZvciBmdW5jdGlvbnMgZ2VuZXJhdGluZyBlcnJvciBtZXNzYWdlcwogICAgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSooLi4uKTsKICAgIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSooLi4uKTsKCiAgICBzdGF0aWMgdm9pZCBjb21wb3NlKlJ1bnRpbWVFcnJvciguLi4pOwogICAgc3RhdGljIGphdmEubGFuZy5Wb2lkIGNvbXBvc2UqUnVudGltZUVycm9yKC4uLik7Cn0YAyIHCJkBEBQYASoWIhTADMEMpAylDKYMpwyoDKkMqgyrDGp8CG4SYi1rZWVwY2xhc3NtZW1iZXJzLGFsbG93c2hyaW5raW5nLGFsbG93b2JmdXNjYXRpb24gaW50ZXJmYWNlICogewogICAgQHJldHJvZml0Mi5odHRwLiogPG1ldGhvZHM+Owp9GAMiBggOEAwYASoKIgjCDMMMxAzFDGpwCG8SWC1rZWVwbmFtZXMgQGFuZHJvaWR4LmhpbHQud29yay5IaWx0V29ya2VyIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkeC53b3JrLkxpc3RlbmFibGVXb3JrZXIYBCIHCJoBEAIYASoHCgFzEgLTAWphCHASRS1rZWVwbmFtZXMgQGNvbS5nb29nbGUuYW5kcm9pZC5nbXMuY29tbW9uLmFubm90YXRpb24uS2VlcE5hbWUgY2xhc3MgKhgEIgYIIhBAGAEqDBIK1AHVAdYB1wHYAWpPCHESNy1rZWVwbmFtZXMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWR4LnN0YXJ0dXAuSW5pdGlhbGl6ZXIYBCIGCC8QAhgBKggSBjs8PT4/QGpICHISNC1rZWVwbmFtZXMgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWR4LndvcmsuSW5wdXRNZXJnZXIYBCIGCDcQDRgBKgQSAtkBalcIcxI5LWtlZXBuYW1lcyBjbGFzcyAqIGV4dGVuZHMgYW5kcm9pZHgud29yay5MaXN0ZW5hYmxlV29ya2VyGAQiBgg3EAIYASoOEgzaAdsB3AHdAd4B0wFqcAh0Elgta2VlcG5hbWVzIGNsYXNzICogaW1wbGVtZW50cyBjb20uZ29vZ2xlLmFuZHJvaWQuZ21zLmNvbW1vbi5pbnRlcm5hbC5SZWZsZWN0ZWRQYXJjZWxhYmxlGAQiBggiECUYASoIEgbfAeAB4QFqbgh1ElYta2VlcG5hbWVzIGNsYXNzIGFuZHJvaWR4LmNvbXBvc2UudWkuaW5wdXQucG9pbnRlci5Qb2ludGVySW5wdXRFdmVudEhhbmRsZXIgewogICAgKjsKfRgEIgYIRBA0GAEqCBIC4gEiAsYMalgIdhJDLWtlZXBuYW1lcyBjbGFzcyBva2h0dHAzLmludGVybmFsLnB1YmxpY3N1ZmZpeC5QdWJsaWNTdWZmaXhEYXRhYmFzZRgEIgcImwEQBRgBKgQSAuMBehcIwawCEMb9BBioig0gn3oo2oMCMLyWBQ==</script>
<script>// Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/* ==========================================================================
APPLICATION LOGIC
==========================================================================
This script handles the interactive features of the Report.
It is divided into:
1. Constants & Configuration
2. UI Utilities (DOM helpers)
3. Main App Controller (Router)
4. ReportApp (The main table/grid view)
========================================================================== */
/**
* Global Constants used throughout the application.
*/
const CONSTANTS = {
VIEWS: {
MODULES: "modules",
PACKAGES: "packages",
DETAILS: "details",
FILE_DETAILS: "file-details"
},
DEFAULTS: {
AGGREGATED: "Aggregated"
},
};
/**
* UI Utilities
* Collection of helper functions for DOM manipulation and common UI patterns.
*/
const UIUtils = {
/**
* Returns the CSS class for score percentage coloring.
* @param {number|string} percentage - The score percentage (0-100 or "--").
* @returns {string} CSS class name.
*/
getScoreClass(percentage) {
if (percentage === "--") return "text-gray-500";
if (percentage >= 80) return "text-green-600";
if (percentage >= 60) return "text-yellow-600";
return "text-red-600";
},
getMatchClass(percentage) {
if (percentage === "--") return "text-gray-500";
if (percentage < 10) return "text-green-600";
if (percentage < 20) return "text-orange-600";
return "text-red-600";
},
/**
* Toggles the visibility of a DOM element.
* @param {HTMLElement} element - The element to toggle.
* @param {boolean} show - Whether to show or hide.
*/
toggleVisibility(element, show) {
if (!element) return;
if (show) {
element.classList.remove("hidden");
// Restore appropriate display type
if (element.id === "ts-selected-state") {
element.style.display = "flex";
} else {
element.style.display = "";
}
} else {
element.classList.add("hidden");
element.style.display = "none";
}
},
/**
* Builds a multi-select dropdown with "Select All" / "Clear" actions (Zone A)
* and a scrollable list of options (Zone B).
*
* @param {string} containerId - ID of the dropdown container.
* @param {Array} options - List of options {name, value}.
* @param {Array} selectedStateArr - Array storing currently selected values.
* @param {Function} onSelectionChange - Callback when selection changes.
* @param {boolean} searchable - Whether to include a search box.
* @param {boolean} multiSelect - Whether to allow multiple selections.
*/
buildActionDropdown(containerId, options, selectedStateArr,
onSelectionChange, searchable = true, multiSelect = true, totalCount =
null, itemName = "items", searchCallback = null) {
const container = document.getElementById(containerId);
if (!container) return;
// Container config
container.innerHTML = "";
container.style.padding = "0";
container.style.overflow = "hidden"; // Clip corners
// --- ZONE 0: Search (Top Level) ---
let searchInput = null;
if (searchable) {
const searchContainer = document.createElement("div");
searchContainer.className = "dropdown-search-zone";
searchContainer.style.padding = "0.5rem";
searchContainer.style.borderBottom = "1px solid var(--border-color)";
searchContainer.style.background = "var(--bg-surface)";
searchInput = document.createElement("input");
searchInput.type = "text";
searchInput.className = "popover-search";
searchInput.style.width = "100%";
searchInput.placeholder = "Search...";
searchContainer.appendChild(searchInput);
container.appendChild(searchContainer);
}
// --- ZONE B: Option List ---
const listZone = document.createElement("div");
listZone.className = "dropdown-scroll-zone";
container.appendChild(listZone);
// Render List Logic
const renderList = (optionsToRender) => {
listZone.innerHTML = "";
if (optionsToRender.length === 0) {
listZone.innerHTML =
`<div class="p-4 text-xs text-gray-400 text-center">No options available</div>`;
return;
}
optionsToRender.forEach(opt => {
// SKIP "All" options if they exist in the passed options list.
if (opt.value === "all") return;
const isChecked = selectedStateArr.includes(opt.value);
const item = document.createElement(multiSelect ? "label" :
"div");
item.className = "popover-item" + (isChecked && !multiSelect ?
" active-item" : "");
let checkbox = null;
if (multiSelect) {
checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.className = "popover-checkbox";
checkbox.checked = isChecked;
item.appendChild(checkbox);
}
const label = document.createElement("span");
label.innerHTML = opt.name;
item.appendChild(label);
// Interaction: Toggle Individual
const handleSelect = (e) => {
if (multiSelect) {
if (checkbox.checked) {
if (!selectedStateArr.includes(opt.value))
selectedStateArr.push(opt.value);
} else {
const idx = selectedStateArr.indexOf(opt.value);
if (idx > -1) selectedStateArr.splice(idx, 1);
}
} else {
selectedStateArr.length = 0;
selectedStateArr.push(opt.value);
}
if (!multiSelect) {
renderList(optionsToRender);
}
onSelectionChange();
};
if (multiSelect) {
item.addEventListener("change", (e) => {
e.stopPropagation();
handleSelect(e);
});
} else {
item.addEventListener("click", (e) => {
e.stopPropagation();
handleSelect(e);
});
}
listZone.appendChild(item);
});
};
renderList(options);
// --- ZONE C: Footer ---
let footer = null;
if (totalCount !== null) {
footer = document.createElement("div");
footer.className = "dropdown-footer";
footer.style.padding = "0.5rem 1rem";
footer.style.fontSize = "0.75rem";
footer.style.color = "var(--text-gray-400)";
footer.style.borderTop = "1px solid var(--border-color)";
footer.style.background = "var(--bg-subtle)";
footer.textContent =
`Showing ${options.length} out of ${totalCount} ${itemName}`;
container.appendChild(footer);
}
// --- Search Logic ---
if (searchInput) {
searchInput.addEventListener("input", (e) => {
const term = e.target.value.toLowerCase();
if (searchCallback) {
const {
options: filteredOptions,
total: mCount
} = searchCallback(term);
renderList(filteredOptions);
if (footer) {
footer.textContent =
`Showing ${filteredOptions.length} out of ${mCount} ${itemName}`;
}
} else {
const items = listZone.querySelectorAll(".popover-item");
let visibleCount = 0;
items.forEach(item => {
const label = item.querySelector("span").textContent
.toLowerCase();
const isVisible = label.includes(term);
item.style.display = isVisible ? "flex" : "none";
if (isVisible) visibleCount++;
});
if (footer && totalCount !== null) {
footer.textContent =
`Showing ${visibleCount} out of ${totalCount} ${itemName}`;
}
}
});
}
},
/**
* Renders the text on the filter chip (e.g., "Module: All" or "Module: :core:network (+2)").
*/
renderChipText(element, label, type, isMulti = false) {
if (!element) return;
// Logic for displaying close button: ALWAYS show if 'type' is present (meaning removable)
// The user specifically requested option to remove filter when all items are selected.
const showClose = !!type;
if (!showClose) {
element.innerHTML = `<span class="filter-text">${label}</span>`;
} else {
element.innerHTML = `
<span class="filter-text">${label}</span>
<span class="chip-close" data-clear="${type}">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="14" height="14">
<path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/>
</svg>
</span>`;
}
},
getFilterLabel(prefix, selectedArr, totalCount, options = []) {
if (selectedArr.length === 0 || (totalCount > 0 && selectedArr.length ===
totalCount)) return `${prefix}: All`;
if (selectedArr.length === 1) {
const val = selectedArr[0];
const opt = options.find(o => String(o.value) === String(val));
const name = opt ? opt.name : val;
// Strip HTML tags if any (like in keepRuleOptions)
const cleanName = name.replace(/<[^>]*>/g, "");
return `${prefix}: ${cleanName}`;
}
return `${prefix}: ${selectedArr.length} Selected`;
},
/**
* Finds the common prefix among an array of strings.
* @param {string[]} strings - Array of strings to analyze.
* @returns {string} The common prefix.
*/
findCommonPrefix(strings) {
if (!strings || strings.length === 0) return "";
let prefix = strings[0];
for (let i = 1; i < strings.length; i++) {
if (strings[i].startsWith("Android Gradle plugin")) {
continue;
}
while (strings[i].indexOf(prefix) !== 0) {
prefix = prefix.substring(0, prefix.length - 1);
if (prefix === "") return "";
}
}
// Ensure we only strip up to the last slash to keep the filename.
const lastSlash = prefix.lastIndexOf('/');
if (lastSlash !== -1) {
return prefix.substring(0, lastSlash + 1);
}
return "";
}
};
/* ==========================================================================
MAIN APP CONTROLLER
========================================================================== */
const App = {
keepRadiusData: null,
lookups: {},
detailsState: {
ruleId: null,
classQuery: "",
fieldQuery: "",
methodQuery: ""
},
init() {
// Initialize Report (Main Grid)
ReportApp.init();
// Load Protobuf Data in the Background
this.loadProtoData();
const headerLink = document.getElementById("header-link");
if (headerLink) {
headerLink.addEventListener("click", (e) => {
e.preventDefault();
this.showReportView();
});
}
// Setup Kept Lists Search listeners
const setupListSearch = (type, stateKey) => {
const toggleBtn = document.querySelector(`.search-toggle-btn[data-target="${type}"]`);
const container = document.getElementById(`${type}-search-container`);
const input = document.getElementById(`${type}-search-input`);
if (toggleBtn && container && input) {
toggleBtn.addEventListener("click", () => {
const isHidden = container.style.display === "none";
container.style.display = isHidden ? "block" : "none";
toggleBtn.classList.toggle("active", isHidden);
if (isHidden) {
input.focus();
} else {
// Clear query when closing search
input.value = "";
App.detailsState[stateKey] = "";
const rule = App.keepRadiusData?.keepRuleKeepRadiusTable.find(r => r.id === parseInt(App.detailsState.ruleId));
if (rule) App.renderKeptLists(rule, type);
}
});
input.addEventListener("input", (e) => {
App.detailsState[stateKey] = e.target.value;
const rule = App.keepRadiusData?.keepRuleKeepRadiusTable.find(r => r.id === parseInt(App.detailsState.ruleId));
if (rule) App.renderKeptLists(rule, type);
});
}
};
setupListSearch("classes", "classQuery");
setupListSearch("fields", "fieldQuery");
setupListSearch("methods", "methodQuery");
},
showDetailsView(ruleId) {
this.detailsState.ruleId = ruleId;
this.detailsState.classQuery = "";
this.detailsState.fieldQuery = "";
this.detailsState.methodQuery = "";
ReportApp.state.currentView = CONSTANTS.VIEWS.DETAILS;
document.getElementById("report-view").style.display = "none";
document.getElementById("file-details-view").style.display = "none";
document.getElementById("report-view-controls").style.display = "none";
document.getElementById("details-view").style.display = "flex";
const ruleContainer = document.getElementById("details-rule-container");
const impactContainer = document.getElementById("details-impact-container");
const identicalRulesBody = document.getElementById(
"details-identical-rules-body");
const identicalRulesHeader = document.getElementById(
"details-identical-rules-header");
const identicalRulesTitle = document.getElementById(
"details-identical-rules-title");
const subsumedByBody = document.getElementById(
"details-subsumed-by-body");
const subsumedByHeader = document.getElementById(
"details-subsumed-by-header");
const subsumedByTitle = document.getElementById(
"details-subsumed-by-title");
const impactHeader = document.getElementById(
"details-rule-impact-header");
const classesContent = document.getElementById("details-classes-content");
const methodsContent = document.getElementById("details-methods-content");
const fieldsContent = document.getElementById("details-fields-content");
let rule = this.keepRadiusData?.keepRuleKeepRadiusTable.find(r => r.id === parseInt(ruleId));
let isGlobal = false;
if (!rule) {
rule = this.keepRadiusData?.globalKeepRuleKeepRadiusTable.find(r => r.id === parseInt(ruleId));
isGlobal = true;
}
if (rule) {
const fileOriginId = rule?.origin?.fileOriginId;
const fileOrigin = this.keepRadiusData?.fileOriginTable.find(f => f
.id === fileOriginId);
let originStr = "";
if (fileOrigin) {
const mavenName = formatMavenCoordinate(fileOrigin.mavenCoordinate);
originStr =
`${mavenName || fileOrigin.filename}:${rule.origin?.lineNumber || 1}`;
if (mavenName) {
originStr += ` (${fileOrigin.filename})`;
}
}
if (ruleContainer) {
const highlightedSource = highlightRule(rule.source);
ruleContainer.innerHTML = `
${originStr ? `<div style="font-size: 0.75rem; color: var(--text-gray-500); margin-bottom: 0.5rem; font-family: var(--font-family-mono);">${escapeHTML(originStr)}</div>` : ""}
<div style="background-color: var(--bg-body); border: 1px solid var(--border-color); border-radius: 4px; padding: 0.75rem;">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0; color: var(--text-main);">${highlightedSource}</pre>
</div>
`;
}
const impactContainer = document.getElementById("details-impact-container");
const relatedRulesContainer = document.getElementById("related-rules-container");
const gridContainer = document.getElementById("details-classes-content")?.parentElement?.parentElement;
if (isGlobal) {
if (impactContainer) impactContainer.parentElement.style.display = "none";
if (relatedRulesContainer) relatedRulesContainer.style.display = "none";
if (gridContainer) gridContainer.style.display = "none";
} else {
if (impactContainer) impactContainer.parentElement.style.display = "";
if (relatedRulesContainer) relatedRulesContainer.style.display = "";
if (gridContainer) gridContainer.style.display = "grid";
const constraintsMap = getConstraintsMap(this.keepRadiusData);
const constraints = constraintsMap.get(rule.constraintsId) || [];
const getTag = (c, label) => {
const isRestricted = constraints.includes(c);
if (!isRestricted) return "";
const color = "oklch(0.446 0.043 257.281)";
const bgColor = "oklch(0.984 0.003 247.858)";
const borderColor = "oklch(0.929 0.013 255.508)";
return `<span class="impact-tag" style="display: inline-block; color: ${color}; background-color: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 4px; padding: 2px 8px; font-size: 10px; font-weight: 400; height: 21px; line-height: 15px; text-transform: uppercase; letter-spacing: 0.25px; box-sizing: border-box; text-align: center;">${label}</span>`;
};
const impactTagsHtml = `
<div class="impact-container">
${getTag('DONT_OBFUSCATE', 'OBFUSCATE')}
${getTag('DONT_OPTIMIZE', 'OPTIMIZE')}
${getTag('DONT_SHRINK', 'SHRINK')}
</div>
`;
const br = rule.keepRadius || {};
const classIds = br.classKeepRadius || [];
const fieldIds = br.fieldKeepRadius || [];
const methodIds = br.methodKeepRadius || [];
const matchedTotal = classIds.length + fieldIds.length + methodIds
.length;
const totalLive = getLiveItemCount(this.keepRadiusData);
const liveClasses = this.keepRadiusData?.buildInfo?.liveClassCount ||
0;
const liveFields = this.keepRadiusData?.buildInfo?.liveFieldCount || 0;
const liveMethods = this.keepRadiusData?.buildInfo?.liveMethodCount ||
0;
const renderMatchCell = (count, total, borderLeft = true) => {
const perc = total > 0 ? (count / total * 100) : 0;
const colorClass = UIUtils.getMatchClass(perc);
const bl = borderLeft ? "border-l border-gray-200" : "";
return `
<td class="text-center ${bl}" style="padding: 1rem; width: 100px; min-width: 100px;">
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<span class="font-medium ${colorClass}">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500 mt-1">${count}</span>
</div>
</td>
`;
};
if (impactContainer) {
const getPerc = (count, total) => total > 0 ? (count / total * 100) : 0;
const classPerc = getPerc(classIds.length, liveClasses);
const fieldPerc = getPerc(fieldIds.length, liveFields);
const methodPerc = getPerc(methodIds.length, liveMethods);
impactContainer.innerHTML = `
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr auto; gap: 2rem; padding: 0; align-items: start;">
<!-- Kept Classes -->
<div>
<div style="color: var(--text-gray-500); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem;">Kept Classes</div>
<div style="display: flex; align-items: baseline; gap: 0.5rem; margin-bottom: 0.5rem;">
<span style="color: oklch(0.505 0.213 27.518); font-size: 1.25rem; font-weight: 500;">${classPerc.toFixed(1)}%</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem;">${classIds.length} / ${liveClasses}</span>
</div>
<div style="height: 4px; background-color: var(--bg-hover); border-radius: 2px; width: 100%;">
<div style="height: 100%; background-color: oklch(0.505 0.213 27.518); border-radius: 2px; width: ${classPerc}%;"></div>
</div>
</div>
<!-- Kept Fields -->
<div>
<div style="color: var(--text-gray-500); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem;">Kept Fields</div>
<div style="display: flex; align-items: baseline; gap: 0.5rem; margin-bottom: 0.5rem;">
<span style="color: oklch(0.505 0.213 27.518); font-size: 1.25rem; font-weight: 500;">${fieldPerc.toFixed(1)}%</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem;">${fieldIds.length} / ${liveFields}</span>
</div>
<div style="height: 4px; background-color: var(--bg-hover); border-radius: 2px; width: 100%;">
<div style="height: 100%; background-color: oklch(0.505 0.213 27.518); border-radius: 2px; width: ${fieldPerc}%;"></div>
</div>
</div>
<!-- Kept Methods -->
<div>
<div style="color: var(--text-gray-500); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem;">Kept Methods</div>
<div style="display: flex; align-items: baseline; gap: 0.5rem; margin-bottom: 0.5rem;">
<span style="color: oklch(0.505 0.213 27.518); font-size: 1.25rem; font-weight: 500;">${methodPerc.toFixed(1)}%</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem;">${methodIds.length} / ${liveMethods}</span>
</div>
<div style="height: 4px; background-color: var(--bg-hover); border-radius: 2px; width: 100%;">
<div style="height: 100%; background-color: oklch(0.505 0.213 27.518); border-radius: 2px; width: ${methodPerc}%;"></div>
</div>
</div>
<!-- Blocked by Rule -->
<div>
<div style="color: var(--text-gray-500); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: .80rem;">Blocked by Rule</div>
<div style="display: flex; align-items: center; gap: 0.5rem;">
${impactTagsHtml}
</div>
</div>
</div>
`;
}
const allRules = this.keepRadiusData?.keepRuleKeepRadiusTable || [];
const subsumingIds = br.subsumedBy || [];
const identicalRules = [];
const subsumedByRules = [];
subsumingIds.forEach(id => {
const otherRule = allRules.find(r => r.id === id);
if (otherRule) {
const otherSubsumedBy = otherRule.keepRadius?.subsumedBy || [];
if (otherSubsumedBy.includes(rule.id)) {
identicalRules.push(otherRule);
} else {
subsumedByRules.push(otherRule);
}
}
});
if (relatedRulesContainer) {
const hasIdentical = identicalRules.length > 0;
const hasSubsumed = subsumedByRules.length > 0;
const renderDetailRuleRow = (r) => {
const rBr = r.keepRadius || {};
const rClassIds = rBr.classKeepRadius || [];
const rFieldIds = rBr.fieldKeepRadius || [];
const rMethodIds = rBr.methodKeepRadius || [];
const totalLive = getLiveItemCount(this.keepRadiusData);
const liveClasses = this.keepRadiusData?.buildInfo?.liveClassCount || 0;
const liveFields = this.keepRadiusData?.buildInfo?.liveFieldCount || 0;
const liveMethods = this.keepRadiusData?.buildInfo?.liveMethodCount || 0;
const renderMatchCell = (count, total) => {
const perc = total > 0 ? (count / total * 100) : 0;
return `
<td class="text-center" style="padding: 0.5rem; border-left: 1px solid var(--border-color);">
<div style="display: flex; flex-direction: column; align-items: center;">
<span style="color: var(--text-red-600); font-weight: 500;">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500">${count}</span>
</div>
</td>
`;
};
const constraintsMap = getConstraintsMap(this.keepRadiusData);
const rConstraints = constraintsMap.get(r.constraintsId) || [];
const getTag = (c, label) => {
const isRestricted = rConstraints.includes(c);
const color = isRestricted ? "oklch(0.446 0.043 257.281)" : "#cbd5e1";
const bgColor = isRestricted ? "oklch(0.984 0.003 247.858)" : "#f8fafc";
const borderColor = isRestricted ? "oklch(0.929 0.013 255.508)" : "#e2e8f0";
return `<span class="impact-tag" style="display: inline-block; color: ${color}; background-color: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 4px; padding: 2px 8px; font-size: 10px; font-weight: 400; height: 21px; line-height: 15px; text-transform: uppercase; letter-spacing: 0.25px; box-sizing: border-box; text-align: center;">${label}</span>`;
};
const impactCell = `
<td style="padding: 1rem; border-left: 1px solid var(--border-color);">
<div class="flex justify-start" style="gap: 0.5rem;">
${getTag('DONT_OBFUSCATE', 'OBFUSCATE')}
${getTag('DONT_OPTIMIZE', 'OPTIMIZE')}
${getTag('DONT_SHRINK', 'SHRINK')}
</div>
</td>
`;
return `
<tr class="table-row border-t border-gray-200 hover:bg-gray-50 cursor-pointer" onclick="App.showDetailsView('${r.id}')">
<td style="padding: 0.5rem; width: 40%;">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0;">${highlightRule(r.source)}</pre>
</td>
${renderMatchCell(rClassIds.length + rFieldIds.length + rMethodIds.length, totalLive)}
${renderMatchCell(rClassIds.length, liveClasses)}
${renderMatchCell(rFieldIds.length, liveFields)}
${renderMatchCell(rMethodIds.length, liveMethods)}
${impactCell}
</tr>
`;
};
const renderSection = (title, rules, explainer) => {
const hasRules = rules.length > 0;
let sectionHtml = `
<div class="table-container" style="display: flex; flex-direction: column;">
<div style="padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); background-color: var(--bg-subtle); display: flex; justify-content: space-between; align-items: center;">
<div>
<span style="font-size: 0.875rem; font-weight: 600;">${title}</span>
<span style="color: var(--text-gray-500); font-size: 0.75rem; margin-left: 0.25rem;">· ${hasRules ? rules.length : 'None'}</span>
</div>
${hasRules ? `<span style="color: var(--text-gray-500); font-size: 0.75rem;">${explainer}</span>` : ''}
</div>
`;
if (hasRules) {
sectionHtml += `
<table style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th rowspan="2" class="text-left bg-gray-50" style="padding: 0 1rem; width: 40%;">RULE</th>
<th colspan="4" class="text-center bg-gray-50" style="padding: .25rem 1rem; width: 40%; border-left: 1px solid var(--border-color);">KEPT ITEMS <span style="color: var(--text-muted);text-transform: none;font-weight: 500;">Higher is worse</span> <span class="tooltip-icon" data-tooltip="Items retained in the app due to this rule">?</span></th>
<th rowspan="2" class="text-left bg-gray-50" style="padding: 0 1rem; width: 20%; border-left: 1px solid var(--border-color);">BLOCKED BY RULE <span class="tooltip-icon" data-tooltip="Specific actions blocked by this rule">?</span></th>
</tr>
<tr>
<th class="text-center text-xs font-medium text-gray-500" style="padding: .15rem 1rem; width: 10%; border-left: 1px solid var(--border-color);">Total</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: .15rem 1rem; width: 10%; border-left: 1px solid var(--border-color);">Classes</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: .15rem 1rem; width: 10%; border-left: 1px solid var(--border-color);">Fields</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: .15rem 1rem; width: 10%; border-left: 1px solid var(--border-color);">Methods</th>
</tr>
</thead>
<tbody>
${rules.map(r => renderDetailRuleRow(r)).join('')}
</tbody>
</table>
`;
}
sectionHtml += `</div>`;
return sectionHtml;
};
if (!hasIdentical && !hasSubsumed) {
relatedRulesContainer.innerHTML = `
<div class="table-container" style="padding: 0.75rem 1rem; font-size: 0.875rem; display: flex; gap: 2rem; align-items: center;">
<span style="font-weight: 600; color: var(--text-gray-900);">Related rules:</span>
<span style="color: var(--text-gray-500);">Identical · None</span>
<span style="color: var(--text-gray-500);">Subsumed by · None</span>
</div>
`;
} else {
let html = '<div style="display: flex; flex-direction: column; gap: 1.5rem;">';
html += renderSection("Identical Rules", identicalRules, "Same matchers, can be deduplicated");
html += renderSection("Subsumed By", subsumedByRules, "Already covered by a broader rule");
html += '</div>';
relatedRulesContainer.innerHTML = html;
}
}
// Reset search inputs UI
const resetSearchUI = (type) => {
const container = document.getElementById(`${type}-search-container`);
const input = document.getElementById(`${type}-search-input`);
const toggleBtn = document.querySelector(`.search-toggle-btn[data-target="${type}"]`);
if (container && input && toggleBtn) {
container.style.display = "none";
input.value = "";
toggleBtn.classList.remove("active");
}
};
resetSearchUI("classes");
resetSearchUI("fields");
resetSearchUI("methods");
// Initial render of kept lists
this.renderKeptLists(rule);
}
} else {
ruleBody.innerHTML =
'<tr><td colspan="2" style="padding: 1rem;">Rule not found.</td></tr>';
classesContent.innerHTML = "";
methodsContent.innerHTML = "";
fieldsContent.innerHTML = "";
}
const fileOrigin = this.keepRadiusData?.fileOriginTable.find(f => f
.id === rule?.origin?.fileOriginId);
const fileOriginName = formatMavenCoordinate(fileOrigin
?.mavenCoordinate) || fileOrigin?.filename;
this.updateDetailsBreadcrumbs(fileOriginName, fileOrigin?.id);
},
renderKeptLists(rule, targetType = null) {
const br = rule.keepRadius || {};
const typeRefMap = App.lookups.typeReference;
const renderList = (ids, getLabel) => {
if (ids.length === 0)
return '<div style="padding: 0.5rem; color: var(--text-gray-500); font-size: 0.8125rem;">None</div>';
const formatSleekItem = (fullName) => {
const firstParen = fullName.indexOf('(');
const searchString = firstParen === -1 ? fullName : fullName.substring(0, firstParen);
const lastDot = searchString.lastIndexOf('.');
if (lastDot === -1) {
return `<span style="color: var(--text-gray-900); font-weight: 500;">${escapeHTML(fullName)}</span>`;
}
const pkg = fullName.substring(0, lastDot + 1);
const name = fullName.substring(lastDot + 1);
return `<span style="color: var(--text-gray-500);">${escapeHTML(pkg)}</span><span style="color: var(--text-gray-900); font-weight: 500;">${escapeHTML(name)}</span>`;
};
const limit = 1000;
const toRender = ids.slice(0, limit);
const listHtml = toRender.map(id => `
<div style="padding: 0.375rem 0.5rem; border-bottom: 1px solid #f1f5f9; font-family: var(--font-family-mono); font-size: 0.8125rem;" class="hover-bg-gray-100">
${formatSleekItem(getLabel(id))}
</div>
`).join("");
if (ids.length > limit) {
return listHtml + `
<div style="padding: 0.5rem; color: var(--text-gray-500); font-size: 0.8125rem; font-style: italic;">
... and ${ids.length - limit} more items
</div>`;
}
return listHtml;
};
// 1. CLASSES COLUMN
if (!targetType || targetType === "classes") {
const classIds = br.classKeepRadius || [];
const classesContent = document.getElementById("details-classes-content");
const filteredClassIds = classIds.filter(id => {
const info = App.lookups.keptClassInfo.get(id);
const name = formatDescriptor(typeRefMap.get(info?.classReferenceId));
return name.toLowerCase().includes(this.detailsState.classQuery.toLowerCase());
});
document.getElementById("details-classes-count").textContent = `· ${filteredClassIds.length}`;
classesContent.innerHTML = renderList(filteredClassIds, (id) => {
const info = App.lookups.keptClassInfo.get(id);
return formatDescriptor(typeRefMap.get(info?.classReferenceId));
});
}
// 2. FIELDS COLUMN
if (!targetType || targetType === "fields") {
const fieldIds = br.fieldKeepRadius || [];
const fieldsContent = document.getElementById("details-fields-content");
const filteredFieldIds = fieldIds.filter(id => {
const info = App.lookups.keptFieldInfo.get(id);
const ref = App.lookups.fieldReference.get(info?.fieldReferenceId);
const name = formatFieldName(ref, App.lookups);
return name.toLowerCase().includes(this.detailsState.fieldQuery.toLowerCase());
});
document.getElementById("details-fields-count").textContent = `· ${filteredFieldIds.length}`;
fieldsContent.innerHTML = renderList(filteredFieldIds, (id) => {
const info = App.lookups.keptFieldInfo.get(id);
const ref = App.lookups.fieldReference.get(info?.fieldReferenceId);
return formatFieldName(ref, App.lookups);
});
}
// 3. METHODS COLUMN
if (!targetType || targetType === "methods") {
const methodIds = br.methodKeepRadius || [];
const methodsContent = document.getElementById("details-methods-content");
const filteredMethodIds = methodIds.filter(id => {
const info = App.lookups.keptMethodInfo.get(id);
const ref = App.lookups.methodReference.get(info?.methodReferenceId);
const name = formatMethodName(ref, App.lookups);
return name.toLowerCase().includes(this.detailsState.methodQuery.toLowerCase());
});
document.getElementById("details-methods-count").textContent = `· ${filteredMethodIds.length}`;
methodsContent.innerHTML = renderList(filteredMethodIds, (id) => {
const info = App.lookups.keptMethodInfo.get(id);
const ref = App.lookups.methodReference.get(info?.methodReferenceId);
return formatMethodName(ref, App.lookups);
});
}
},
showReportView() {
ReportApp.state.currentView = CONSTANTS.VIEWS.MODULES;
document.getElementById("details-view").style.display = "none";
document.getElementById("file-details-view").style.display = "none";
document.getElementById("report-view-controls").style.display = "flex";
document.getElementById("report-view").style.display = "flex";
ReportApp.render();
},
showFileDetailsView(fileOriginId) {
ReportApp.state.currentView = CONSTANTS.VIEWS.FILE_DETAILS;
ReportApp.state.drillContext.fileOriginId = fileOriginId;
this.renderFileDetailsView(fileOriginId);
},
renderFileDetailsView(fileOriginId) {
document.getElementById("report-view").style.display = "none";
document.getElementById("details-view").style.display = "none";
document.getElementById("report-view-controls").style.display = "none";
document.getElementById("file-details-view").style.display = "flex";
const impactBody = document.getElementById("file-details-impact-body");
const rulesBody = document.getElementById("file-details-rules-body");
const rulesHeader = document.getElementById("file-details-rules-header");
const fileOrigin = this.keepRadiusData?.fileOriginTable.find(f => f
.id === parseInt(fileOriginId));
if (!fileOrigin) return;
const fileRules = this.keepRadiusData.keepRuleKeepRadiusTable
.filter(r => r.origin?.fileOriginId === fileOrigin.id);
const globalRules = [];
if (this.keepRadiusData.globalKeepRuleKeepRadiusTable) {
const totalClasses = this.keepRadiusData?.buildInfo?.liveClassCount || 0;
const totalFields = this.keepRadiusData?.buildInfo?.liveFieldCount || 0;
const totalMethods = this.keepRadiusData?.buildInfo?.liveMethodCount || 0;
this.keepRadiusData.globalKeepRuleKeepRadiusTable.forEach(rule => {
if (rule.source === '-dontoptimize' || rule.source === '-dontshrink' || rule.source === '-dontobfuscate') {
if (rule.origin?.fileOriginId === fileOrigin.id) {
globalRules.push({
id: rule.id,
source: rule.source,
constraintsId: rule.constraintsId,
isGlobal: true,
keepRadius: {
classKeepRadius: new Array(totalClasses),
fieldKeepRadius: new Array(totalFields),
methodKeepRadius: new Array(totalMethods),
}
});
}
}
});
}
const allRulesForFile = [...globalRules, ...fileRules];
let rules = allRulesForFile;
const lens = ReportApp.state.filters.keepRules[0];
if (lens) {
rules = ReportApp.applyKeepRuleLens(rules, lens);
}
const isIdenticalLens = lens === "Identical";
const isSubsumedLens = lens === "Subsumed";
if (isIdenticalLens || isSubsumedLens) {
rulesHeader.innerHTML = `
<tr>
<th class="text-left bg-gray-50 z-30" style="padding: 1rem; width: 600px; min-width: 600px; border-bottom: 1px solid var(--border-color);">Rule</th>
<th class="text-left bg-gray-50 border-l border-gray-200" style="padding: 1rem; width: 100%; border-bottom: 1px solid var(--border-color);">${isIdenticalLens ? 'Identical Rules' : 'Subsumed By'}</th>
</tr>
`;
} else {
rulesHeader.innerHTML = `
<tr>
<th rowspan="2" class="text-left bg-gray-50" style="padding: 1rem; width: 40%; border-bottom: 1px solid var(--border-color);">Rule</th>
<th colspan="4" class="text-center bg-gray-50" style="padding: 0.5rem; width: 40%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Kept Items <span style="color: var(--text-muted);text-transform: none;font-weight: 500;">Higher is worse</span></th>
<th rowspan="2" class="text-left bg-gray-50" style="padding: 0.5rem; width: 20%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Blocked by Rule</th>
</tr>
<tr>
<th class="text-center text-xs font-medium text-gray-500" style="padding: 0.5rem; width: 10%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Total</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: 0.5rem; width: 10%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Classes</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: 0.5rem; width: 10%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Fields</th>
<th class="text-center text-xs font-medium text-gray-500" style="padding: 0.5rem; width: 10%; border-left: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);">Methods</th>
</tr>
`;
}
const liveClasses = this.keepRadiusData?.buildInfo?.liveClassCount || 0;
const liveFields = this.keepRadiusData?.buildInfo?.liveFieldCount || 0;
const liveMethods = this.keepRadiusData?.buildInfo?.liveMethodCount || 0;
const matchedClasses = new Set();
const matchedFields = new Set();
const matchedMethods = new Set();
allRulesForFile.forEach(rule => {
const br = rule.keepRadius || {};
(br.classKeepRadius || []).forEach(id => matchedClasses.add(id));
(br.fieldKeepRadius || []).forEach(id => matchedFields.add(id));
(br.methodKeepRadius || []).forEach(id => matchedMethods.add(id));
});
const renderMatchCell = (count, total, borderLeft = true) => {
const perc = total > 0 ? (count / total * 100) : 0;
const colorClass = UIUtils.getMatchClass(perc);
const bl = borderLeft ? "border-l border-gray-200" : "";
return `
<td class="text-center ${bl}" style="padding: 1rem;">
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<span class="font-medium ${colorClass}">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500 mt-1">${count}</span>
</div>
</td>
`;
};
impactBody.innerHTML = `
<tr class="border-t border-gray-200">
${renderMatchCell(matchedClasses.size, liveClasses, false)}
${renderMatchCell(matchedFields.size, liveFields)}
${renderMatchCell(matchedMethods.size, liveMethods)}
</tr>
`;
rulesBody.innerHTML = rules.map(rule => {
if (isIdenticalLens || isSubsumedLens) {
const list = isIdenticalLens ? rule.identicalRules : rule
.subsumedByRules;
const otherRulesHtml = (list || []).map(other => `
<div class="text-xs text-blue-600 hover:underline cursor-pointer mb-1" onclick="event.stopPropagation(); App.showDetailsView('${other.id}')">
<pre style="white-space: pre-wrap; margin: 0; font-family: var(--font-family-mono);">${escapeHTML(other.source)}</pre>
</div>
`).join("");
return `
<tr class="border-t border-gray-200 hover:bg-gray-50 cursor-pointer" onclick="App.showDetailsView('${rule.id}')">
<td class="sticky-name font-medium text-blue-600 hover:underline" title="${escapeHTML(rule.source)}" style="padding: 1rem; width: 600px; min-width: 600px;">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0; pointer-events: none;">${escapeHTML(rule.source)}</pre>
</td>
<td class="border-l border-gray-200" style="padding: 1rem; width: 100%;">
${otherRulesHtml || '<span class="text-gray-400 italic">None</span>'}
</td>
</tr>
`;
}
const br = rule.keepRadius || {};
const c = (br.classKeepRadius || []).length;
const f = (br.fieldKeepRadius || []).length;
const m = (br.methodKeepRadius || []).length;
const constraintsMap = getConstraintsMap(this.keepRadiusData);
let constraints = [...(constraintsMap.get(rule.constraintsId) || [])];
if (rule.isGlobal) {
if (rule.source === '-dontobfuscate' && !constraints.includes('DONT_OBFUSCATE')) {
constraints.push('DONT_OBFUSCATE');
}
if (rule.source === '-dontoptimize' && !constraints.includes('DONT_OPTIMIZE')) {
constraints.push('DONT_OPTIMIZE');
}
if (rule.source === '-dontshrink' && !constraints.includes('DONT_SHRINK')) {
constraints.push('DONT_SHRINK');
}
}
const getTag = (c, label) => {
const isRestricted = constraints.includes(c);
const color = isRestricted ? "oklch(0.446 0.043 257.281)" : "#cbd5e1";
const bgColor = isRestricted ? "oklch(0.984 0.003 247.858)" : "#f8fafc";
const borderColor = isRestricted ? "oklch(0.929 0.013 255.508)" : "#e2e8f0";
return `<span class="impact-tag" style="display: inline-block; color: ${color}; background-color: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 4px; padding: 2px 8px; font-size: 10px; font-weight: 400; height: 21px; line-height: 15px; text-transform: uppercase; letter-spacing: 0.25px; box-sizing: border-box; text-align: center;">${label}</span>`;
};
const impactCell = `
<td style="padding: 0.5rem; border-left: 1px solid var(--border-color);">
<div class="flex justify-start" style="gap: 0.5rem;">
${getTag('DONT_OBFUSCATE', 'OBFUSCATE')}
${getTag('DONT_OPTIMIZE', 'OPTIMIZE')}
${getTag('DONT_SHRINK', 'SHRINK')}
</div>
</td>
`;
const renderMatchCell = (count, total, borderLeft = true) => {
const perc = total > 0 ? (count / total * 100) : 0;
const colorClass = UIUtils.getMatchClass(perc);
const bl = borderLeft ? "border-left: 1px solid var(--border-color);" : "";
return `
<td class="text-center" style="padding: 1rem; ${bl}">
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<span class="font-medium ${colorClass}">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500 mt-1">${count}</span>
</div>
</td>
`;
};
const totalLive = getLiveItemCount(this.keepRadiusData);
const liveClasses = this.keepRadiusData?.buildInfo?.liveClassCount || 0;
const liveFields = this.keepRadiusData?.buildInfo?.liveFieldCount || 0;
const liveMethods = this.keepRadiusData?.buildInfo?.liveMethodCount || 0;
const highlightedSource = highlightRule(rule.source);
return `
<tr class="border-t border-gray-200 hover:bg-gray-50 cursor-pointer" onclick="App.showDetailsView('${rule.id}')">
<td style="padding: 0.5rem; width: 40%;">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0;">${highlightedSource}</pre>
</td>
${renderMatchCell(c + f + m, totalLive, true)}
${renderMatchCell(c, liveClasses)}
${renderMatchCell(f, liveFields)}
${renderMatchCell(m, liveMethods)}
${impactCell}
</tr>
`;
}).join("");
const fileOriginName = formatMavenCoordinate(fileOrigin
.mavenCoordinate) || fileOrigin.filename;
this.updateFileDetailsBreadcrumbs(fileOriginName);
},
updateFileDetailsBreadcrumbs(filename) {
const bc = document.getElementById("file-details-breadcrumbs");
if (!bc) return;
const linkClass = "breadcrumb-pill";
const textClass = "breadcrumb-text";
const sep = '<span class="text-gray-300 mx-1">/</span>';
bc.innerHTML = `
<span class="${linkClass}" id="file-details-back-to-summary">Project</span>
${sep}
<span class="${textClass}">${escapeHTML(filename)}</span>
`;
document.getElementById("file-details-back-to-summary").addEventListener(
"click", () => {
this.showReportView();
});
},
updateDetailsBreadcrumbs(filename, fileOriginId) {
const bc = document.getElementById("details-breadcrumbs");
if (!bc) return;
const linkClass = "breadcrumb-pill";
const textClass = "breadcrumb-text";
const sep = '<span class="text-gray-300 mx-1">/</span>';
let html = `
<span class="${linkClass}" id="details-back-to-summary">Project</span>
${sep}`;
if (filename && fileOriginId !== undefined) {
html += `
<span class="${linkClass}" id="details-back-to-file">${escapeHTML(filename)}</span>
${sep}`;
}
html += `<span class="${textClass}">Keep Rule Details</span>`;
bc.innerHTML = html;
document.getElementById("details-back-to-summary").addEventListener(
"click", () => {
this.showReportView();
});
if (filename && fileOriginId !== undefined) {
document.getElementById("details-back-to-file").addEventListener(
"click", () => {
this.showFileDetailsView(fileOriginId);
});
}
},
async loadProtoData() {
const embeddedProtoSchemaSource = document.getElementById('keepradius-proto');
const embeddedProtoDataSource = document.getElementById('keepradius-data');
try {
const root = protobuf.parse(embeddedProtoSchemaSource.textContent).root;
const data = embeddedProtoDataSource.textContent.trim();
const bytes = Uint8Array.from(atob(data), c => c.charCodeAt(0));
const KeepRadiusContainer = root.lookupType(
"com.android.tools.r8.keepradius.proto.KeepRadiusContainer");
const message = KeepRadiusContainer.decode(bytes);
this.keepRadiusData = KeepRadiusContainer.toObject(message, {
longs: String,
enums: String,
bytes: String,
defaults: true,
arrays: true,
objects: true,
oneofs: true
});
// Extract and strip common prefix from file names
if (this.keepRadiusData.fileOriginTable) {
const filenames = this.keepRadiusData.fileOriginTable.map(f => f
.filename).filter(Boolean);
const commonPrefix = UIUtils.findCommonPrefix(filenames);
if (commonPrefix) {
this.keepRadiusData.fileOriginTable.forEach(f => {
if (f.filename && f.filename.startsWith(commonPrefix)) {
f.filename = f.filename.substring(commonPrefix.length);
}
});
}
}
// Build highly optimized O(1) lookup Maps for details and filtering views
App.lookups = {
keptClassInfo: new Map((this.keepRadiusData.keptClassInfoTable || []).map(c => [c.id, c])),
keptFieldInfo: new Map((this.keepRadiusData.keptFieldInfoTable || []).map(f => [f.id, f])),
keptMethodInfo: new Map((this.keepRadiusData.keptMethodInfoTable || []).map(m => [m.id, m])),
fieldReference: new Map((this.keepRadiusData.fieldReferenceTable || []).map(r => [r.id, r])),
methodReference: new Map((this.keepRadiusData.methodReferenceTable || []).map(r => [r.id, r])),
protoReference: new Map((this.keepRadiusData.protoReferenceTable || []).map(p => [p.id, p])),
typeReferenceList: new Map((this.keepRadiusData.typeReferenceListTable || []).map(l => [l.id, l])),
typeReference: new Map((this.keepRadiusData.typeReferenceTable || []).map(t => [t.id, t.javaDescriptor]))
};
console.log("Protobuf data loaded successfully:", this
.keepRadiusData);
// Trigger re-render now that data is available
ReportApp.render();
} catch (err) {
console.error("Failed to load protobuf data:", err);
}
},
};
/* ==========================================================================
REPORT APP (Grid/List View)
========================================================================== */
const ReportApp = {
state: {
currentView: CONSTANTS.VIEWS.MODULES,
filters: {
keepRules: [],
classes: [],
fields: [],
methods: []
},
activeFilterChips: [],
sort: {
by: "matches.total",
order: "desc"
},
drillContext: {
module: null,
pkg: null,
fileOriginId: null
}, // Navigation path
statsVisible: true,
searchTerm: "",
showBlockedByRule: true
},
elements: {},
init() {
this.cacheDOMElements();
this.populateHeaderInfo();
this.populateFilters();
this.bindEvents();
this.render();
},
cacheDOMElements() {
const getById = (id) => document.getElementById(id);
this.elements = {
clsChip: getById("cls-chip-container"),
clsBtn: getById("cls-filter-btn"),
clsDropdown: getById("cls-dropdown"),
clsText: getById("cls-filter-text"),
fieldChip: getById("field-chip-container"),
fieldBtn: getById("field-filter-btn"),
fieldDropdown: getById("field-dropdown"),
fieldText: getById("field-filter-text"),
methodChip: getById("method-chip-container"),
methodBtn: getById("method-filter-btn"),
methodDropdown: getById("method-dropdown"),
methodText: getById("method-filter-text"),
addFilterContainer: getById("add-filter-container"),
addFilterBtn: getById("add-filter-btn"),
addFilterDropdown: getById("add-filter-dropdown"),
addFilterList: getById("add-filter-list"),
grpBtn: getById("group-by-btn"),
grpDropdown: getById("group-by-dropdown"),
grpText: getById("group-by-text"),
grpContainer: getById("group-by-container"),
grpList: getById("group-by-list"),
tableHeaders: getById("table-headers"),
tableData: getById("table-data"),
statsTableHeaders: getById("stats-table-headers"),
statsTableData: getById("stats-table-data"),
statsContainer: getById("stats-container"),
mainTable: getById("main-table"),
totalObfuscation: getById("total-obfuscation"),
totalOptimization: getById("total-optimization"),
totalShrinking: getById("total-shrinking"),
searchInput: getById("search-input"),
clearSearchBtn: getById("clear-search-btn"),
searchContainer: getById("search-container"),
searchIconBtn: getById("search-icon-btn"),
toggleColumnsBtn: getById("toggle-columns-btn"),
columnsDropdown: getById("columns-dropdown"),
toggleBlockedByRuleCb: getById("toggle-blocked-by-rule-cb"),
};
},
populateHeaderInfo() { },
/**
* Initializes all filters (Variants, Modules, etc.)
*/
populateFilters() {
// --- 1. Dynamic Filters (Modules/Packages/Classes) ---
this.updateDynamicFilters();
},
/**
* Updates the available options in Module/Package/Class dropdowns based on dependencies.
* e.g., Selecting "Module A" filters the Package options to only those in Module A.
*/
updateDynamicFilters() {
const {
keepRules,
classes,
fields,
methods
} = this.state.filters;
const chips = this.state.activeFilterChips;
// --- 1. Keep Rules Lens ---
const keepRuleOptions = [{
name: "<b>Identical:</b> Show rules that match the same items as other rules",
value: "Identical"
},
{
name: "<b>Subsumed:</b> Show rules that match a subset of the items matched by another rule",
value: "Subsumed"
},
{
name: "<b>Unused:</b> Show rules that don't match anything",
value: "Unused"
},
];
const lens = this.state.filters.keepRules[0] || "All";
const tabsContainer = document.getElementById("lens-tabs");
if (tabsContainer) {
tabsContainer.querySelectorAll(".segment-btn").forEach(btn => {
if (btn.dataset.lens === lens) {
btn.classList.add("active");
} else {
btn.classList.remove("active");
}
});
}
// --- 2. Classes Filter ---
const {
options: classOptions,
total: totalClasses
} = this.getKeptClasses();
UIUtils.buildActionDropdown("cls-dropdown", classOptions, classes, () => {
this.updateDynamicFilters();
this.render();
}, true, true, totalClasses, "classes", (term) => {
const brData = App.keepRadiusData;
if (!brData || !brData.keptClassInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const filtered = brData.keptClassInfoTable.filter(c => {
const name = formatDescriptor(typeRefMap.get(c
.classReferenceId));
return name.toLowerCase().includes(term);
});
const results = filtered.slice(0, 1000).map(c => {
const name = escapeHTML(formatDescriptor(typeRefMap.get(c
.classReferenceId)));
return {
name,
value: c.id
};
});
return {
options: results,
total: filtered.length
};
});
UIUtils.renderChipText(this.elements.clsText, UIUtils.getFilterLabel(
"Classes", classes, totalClasses, classOptions), "class", true);
UIUtils.toggleVisibility(this.elements.clsChip, chips.includes("class"));
// --- 3. Fields Filter ---
const {
options: fieldOptions,
total: totalFields
} = this.getKeptFields();
UIUtils.buildActionDropdown("field-dropdown", fieldOptions, fields,
() => {
this.updateDynamicFilters();
this.render();
}, true, true, totalFields, "fields", (term) => {
const brData = App.keepRadiusData;
if (!brData || !brData.keptFieldInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const fieldRefMap = new Map();
brData.fieldReferenceTable.forEach(f => fieldRefMap.set(f.id, f));
const filtered = brData.keptFieldInfoTable.filter(f => {
const fieldRef = fieldRefMap.get(f.fieldReferenceId);
const name = formatFieldName(fieldRef, brData, typeRefMap);
return name.toLowerCase().includes(term);
});
const results = filtered.slice(0, 1000).map(f => {
const fieldRef = fieldRefMap.get(f.fieldReferenceId);
const name = escapeHTML(formatFieldName(fieldRef, brData,
typeRefMap));
return {
name,
value: f.id
};
});
return {
options: results,
total: filtered.length
};
});
UIUtils.renderChipText(this.elements.fieldText, UIUtils.getFilterLabel(
"Fields", fields, totalFields, fieldOptions), "field", true);
UIUtils.toggleVisibility(this.elements.fieldChip, chips.includes(
"field"));
// --- 4. Methods Filter ---
const {
options: methodOptions,
total: totalMethods
} = this.getKeptMethods();
UIUtils.buildActionDropdown("method-dropdown", methodOptions, methods,
() => {
this.updateDynamicFilters();
this.render();
}, true, true, totalMethods, "methods", (term) => {
const brData = App.keepRadiusData;
if (!brData || !brData.keptMethodInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const methodRefMap = new Map();
brData.methodReferenceTable.forEach(m => methodRefMap.set(m.id, m));
const filtered = brData.keptMethodInfoTable.filter(m => {
const methodRef = methodRefMap.get(m.methodReferenceId);
const name = formatMethodName(methodRef, brData, typeRefMap);
return name.toLowerCase().includes(term);
});
const results = filtered.slice(0, 1000).map(m => {
const methodRef = methodRefMap.get(m.methodReferenceId);
const name = escapeHTML(formatMethodName(methodRef, brData,
typeRefMap));
return {
name,
value: m.id
};
});
return {
options: results,
total: filtered.length
};
});
UIUtils.renderChipText(this.elements.methodText, UIUtils.getFilterLabel(
"Methods", methods, totalMethods, methodOptions), "method", true);
UIUtils.toggleVisibility(this.elements.methodChip, chips.includes(
"method"));
// --- Add Filter Button Logic ---
const availableFilters = [];
if (!chips.includes("class")) availableFilters.push({
name: "Classes",
value: "class",
options: classOptions,
total: totalClasses,
state: classes
});
if (!chips.includes("field")) availableFilters.push({
name: "Fields",
value: "field",
options: fieldOptions,
total: totalFields,
state: fields
});
if (!chips.includes("method")) availableFilters.push({
name: "Methods",
value: "method",
options: methodOptions,
total: totalMethods,
state: methods
});
if (availableFilters.length > 0) {
this.elements.addFilterContainer.classList.remove("hidden");
this.elements.addFilterList.innerHTML = availableFilters
.map(f =>
`<a href="#" class="dropdown-item add-filter-option" data-value="${f.value}">${f.name}</a>`
)
.join("");
this.elements.addFilterList.querySelectorAll(".add-filter-option")
.forEach(item => {
item.addEventListener("click", (e) => {
e.preventDefault();
e.stopPropagation();
const val = item.dataset.value;
if (!this.state.activeFilterChips.includes(val)) {
this.state.activeFilterChips.push(val);
}
// Close the "Add filter" dropdown
this.elements.addFilterDropdown.classList.add("hidden");
this.elements.addFilterBtn.classList.remove("bg-gray-200");
this.updateDynamicFilters();
this.render();
// Auto-open newly added dropdown
setTimeout(() => {
if (val === "class") this.toggleDropdown(this.elements
.clsDropdown, this.elements.clsBtn);
if (val === "field") this.toggleDropdown(this.elements
.fieldDropdown, this.elements.fieldBtn);
if (val === "method") this.toggleDropdown(this
.elements.methodDropdown, this.elements.methodBtn);
}, 0);
});
});
} else {
this.elements.addFilterContainer.classList.add("hidden");
}
},
getKeptClasses() {
const brData = App.keepRadiusData;
if (!brData || !brData.keptClassInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const options = brData.keptClassInfoTable.slice(0, 1000).map(c => {
const name = escapeHTML(formatDescriptor(typeRefMap.get(c
.classReferenceId)));
return {
name,
value: c.id
};
});
return {
options,
total: brData.keptClassInfoTable.length
};
},
getKeptFields() {
const brData = App.keepRadiusData;
if (!brData || !brData.keptFieldInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const fieldRefMap = new Map();
brData.fieldReferenceTable.forEach(f => fieldRefMap.set(f.id, f));
const options = brData.keptFieldInfoTable.slice(0, 1000).map(f => {
const fieldRef = fieldRefMap.get(f.fieldReferenceId);
const name = escapeHTML(formatFieldName(fieldRef, brData,
typeRefMap));
return {
name,
value: f.id
};
});
return {
options,
total: brData.keptFieldInfoTable.length
};
},
getKeptMethods() {
const brData = App.keepRadiusData;
if (!brData || !brData.keptMethodInfoTable) return {
options: [],
total: 0
};
const typeRefMap = new Map();
brData.typeReferenceTable.forEach(t => typeRefMap.set(t.id, t
.javaDescriptor));
const methodRefMap = new Map();
brData.methodReferenceTable.forEach(m => methodRefMap.set(m.id, m));
const options = brData.keptMethodInfoTable.slice(0, 1000).map(m => {
const methodRef = methodRefMap.get(m.methodReferenceId);
const name = escapeHTML(formatMethodName(methodRef, brData,
typeRefMap));
return {
name,
value: m.id
};
});
return {
options,
total: brData.keptMethodInfoTable.length
};
},
toggleDropdown(dropdown, triggerBtn = null) {
const allHelpers = [{
dd: this.elements.grpDropdown,
btn: this.elements.grpBtn
},
{
dd: this.elements.clsDropdown,
btn: this.elements.clsBtn
},
{
dd: this.elements.fieldDropdown,
btn: this.elements.fieldBtn
},
{
dd: this.elements.methodDropdown,
btn: this.elements.methodBtn
},
{
dd: this.elements.addFilterDropdown,
btn: this.elements.addFilterBtn
},
{
dd: this.elements.columnsDropdown,
btn: this.elements.toggleColumnsBtn
},
];
const isOpening = dropdown.classList.contains("hidden");
// Close all others first
allHelpers.forEach(({
dd,
btn
}) => {
if (dd !== dropdown) {
if (dd) dd.classList.add("hidden");
if (btn) btn.classList.remove("bg-gray-200");
}
});
if (isOpening) {
dropdown.classList.remove("hidden");
if (triggerBtn) triggerBtn.classList.add("bg-gray-200");
} else {
dropdown.classList.add("hidden");
if (triggerBtn) triggerBtn.classList.remove("bg-gray-200");
}
},
bindEvents() {
// --- Dropdown Management ---
const map = [{
btn: this.elements.grpBtn,
dd: this.elements.grpDropdown
},
{
btn: this.elements.clsBtn,
dd: this.elements.clsDropdown
},
{
btn: this.elements.fieldBtn,
dd: this.elements.fieldDropdown
},
{
btn: this.elements.methodBtn,
dd: this.elements.methodDropdown
},
{
btn: this.elements.addFilterBtn,
dd: this.elements.addFilterDropdown
},
{
btn: this.elements.toggleColumnsBtn,
dd: this.elements.columnsDropdown
},
];
map.forEach(({
btn,
dd
}) => {
if (btn && dd) {
btn.addEventListener("click", (e) => {
if (e.target.closest(".chip-close")) return;
e.stopPropagation();
this.toggleDropdown(dd, btn);
this.updateDynamicFilters();
});
}
});
// --- Column Toggle ---
if (this.elements.toggleBlockedByRuleCb) {
this.elements.toggleBlockedByRuleCb.addEventListener("change", (e) => {
this.state.showBlockedByRule = e.target.checked;
this.render();
});
}
const tabsContainer = document.getElementById("lens-tabs");
if (tabsContainer) {
tabsContainer.addEventListener("click", (e) => {
const btn = e.target.closest(".segment-btn");
if (!btn) return;
const lens = btn.dataset.lens;
this.state.filters.keepRules = lens === "All" ? [] : [lens];
this.updateDynamicFilters();
this.render();
});
}
// Global click listener to close dropdowns
document.addEventListener("click", (e) => {
let anyClosed = false;
map.forEach(({
dd,
btn
}) => {
if (dd && !dd.contains(e.target) && (!btn || !btn.contains(e
.target))) {
if (!dd.classList.contains("hidden")) {
dd.classList.add("hidden");
if (btn) btn.classList.remove("bg-gray-200");
anyClosed = true;
}
}
});
if (anyClosed) {
this.updateDynamicFilters();
}
// Close search bar if clicked outside
if (this.elements.searchContainer && !this.elements.searchContainer.contains(e.target)) {
this.elements.searchContainer.classList.remove("active");
}
});
// Chip removals
document.getElementById("filter-chips-container").addEventListener(
"click", (e) => {
const closeBtn = e.target.closest(".chip-close");
if (closeBtn) {
e.stopPropagation();
const type = closeBtn.dataset.clear;
if (type === "module") {
this.state.filters.keepRules = [];
this.state.activeFilterChips = this.state.activeFilterChips
.filter(c => c !== "module");
} else if (type === "class") {
this.state.filters.classes = [];
this.state.activeFilterChips = this.state.activeFilterChips
.filter(c => c !== "class");
} else if (type === "field") {
this.state.filters.fields = [];
this.state.activeFilterChips = this.state.activeFilterChips
.filter(c => c !== "field");
} else if (type === "method") {
this.state.filters.methods = [];
this.state.activeFilterChips = this.state.activeFilterChips
.filter(c => c !== "method");
}
this.updateDynamicFilters();
this.render();
}
});
// --- Group By Dropdown ---
this.elements.grpDropdown.addEventListener("click", (e) => {
const item = e.target.closest(".dropdown-item");
if (!item) return;
e.preventDefault();
this.state.currentView = item.dataset.value;
this.state.drillContext = {
module: null,
pkg: null
}; // Reset Drill-Down
// Reset default sort based on view
if (this.state.currentView === CONSTANTS.VIEWS.CLASSES ||
this.state.currentView === CONSTANTS.VIEWS.FIELDS ||
this.state.currentView === CONSTANTS.VIEWS.METHODS) {
this.state.sort = {
by: "name",
order: "asc"
};
} else {
this.state.sort = {
by: "matches.total",
order: "desc"
};
}
this.toggleDropdown(this.elements.grpDropdown, this.elements
.grpBtn);
this.render();
});
// --- Table Sorting ---
this.elements.tableHeaders.addEventListener("click", (e) => {
const th = e.target.closest("[data-sort-by]");
if (!th) return;
const newSortBy = th.dataset.sortBy;
if (this.state.sort.by === newSortBy)
this.state.sort.order = this.state.sort.order === "asc" ? "desc" :
"asc";
else {
this.state.sort.by = newSortBy;
this.state.sort.order = "desc";
}
this.render();
});
// --- Table Row Interaction (Manual Drill-Down) ---
this.elements.tableData.addEventListener("click", (e) => {
const ruleTd = e.target.closest("td[data-rule-id]");
if (ruleTd) {
e.preventDefault();
App.showDetailsView(ruleTd.dataset.ruleId);
return;
}
const fileTd = e.target.closest("td[data-file-origin-id]");
if (fileTd) {
e.preventDefault();
App.showFileDetailsView(fileTd.dataset.fileOriginId);
return;
}
const td = e.target.closest("td[data-name]");
if (!td) return;
const {
name,
type,
moduleName
} = td.dataset;
// Update Drill-Context (Silent)
if (type === "module") {
this.state.drillContext.module = name;
this.state.drillContext.pkg = null;
} else if (type === "package") {
this.state.drillContext.module = moduleName || this.state
.drillContext.module;
this.state.drillContext.pkg = name;
}
this.updateBreadcrumbs();
this.render();
});
// --- Search Icon Toggle ---
if (this.elements.searchIconBtn) {
this.elements.searchIconBtn.addEventListener("click", (e) => {
e.stopPropagation();
this.elements.searchContainer.classList.toggle("active");
if (this.elements.searchContainer.classList.contains("active")) {
this.elements.searchInput.focus();
}
});
}
// --- Search Input ---
if (this.elements.searchInput) {
this.elements.searchInput.addEventListener("input", (e) => {
this.state.searchTerm = e.target.value;
if (this.state.searchTerm) {
this.elements.clearSearchBtn.classList.remove("hidden");
} else {
this.elements.clearSearchBtn.classList.add("hidden");
}
this.render();
});
}
if (this.elements.clearSearchBtn) {
this.elements.clearSearchBtn.addEventListener("click", () => {
this.elements.searchInput.value = "";
this.state.searchTerm = "";
this.elements.clearSearchBtn.classList.add("hidden");
this.render();
});
}
// --- Help Hub Events ---
const helpHubFab = document.getElementById("help-hub-fab");
const helpHubPanel = document.getElementById("help-hub-panel");
const closeHelpHubBtn = document.getElementById("close-help-hub");
const helpHubSearchInput = document.querySelector("#help-hub-panel .search-input");
if (helpHubFab && helpHubPanel) {
helpHubFab.addEventListener("click", (e) => {
e.stopPropagation();
helpHubPanel.classList.toggle("open");
});
}
if (closeHelpHubBtn && helpHubPanel) {
closeHelpHubBtn.addEventListener("click", (e) => {
e.stopPropagation();
helpHubPanel.classList.remove("open");
});
}
// Close help hub when clicking outside
document.addEventListener("click", (e) => {
if (helpHubPanel && !helpHubPanel.contains(e.target) && !helpHubFab.contains(e.target)) {
helpHubPanel.classList.remove("open");
}
});
// Help Hub Accordion
if (helpHubPanel) {
const legendItems = helpHubPanel.querySelectorAll(".legend-item");
legendItems.forEach(item => {
const header = item.querySelector(".legend-item-header");
if (header) {
header.addEventListener("click", () => {
// Close all other items
legendItems.forEach(other => {
if (other !== item) {
other.classList.remove("open");
}
});
// Toggle current item
item.classList.toggle("open");
});
}
});
}
},
/**
* Core Data Pipeline: Filters and Flattens data based on current View Mode and Filters.
*/
applyKeepRuleLens(rules, lens) {
const brData = App.keepRadiusData;
if (!lens || !brData) return rules;
const ruleMap = new Map();
brData.keepRuleKeepRadiusTable.forEach(r => {
ruleMap.set(r.id, r);
});
return rules.filter(r => {
const getSubsumedBy = (rule) => rule.subsumedBy || (rule
.keepRadius && rule.keepRadius.subsumedBy) || [];
const getMatchesTotal = (rule) => {
if (rule.matches && rule.matches.total !== undefined)
return rule.matches.total;
const b = rule.keepRadius || {};
return (b.classKeepRadius || []).length + (b
.fieldKeepRadius || []).length + (b.methodKeepRadius ||
[]).length;
};
const subsumedBy = getSubsumedBy(r);
if (lens === "Identical") {
const identical = subsumedBy.filter(otherId => {
const other = ruleMap.get(otherId);
return other && (other.keepRadius?.subsumedBy || [])
.includes(r.id);
}).map(otherId => ruleMap.get(otherId));
if (identical.length > 0) {
r.identicalRules = identical;
return true;
}
return false;
} else if (lens === "Subsumed") {
if (subsumedBy.length > 0) {
r.subsumedByRules = subsumedBy.map(id => ruleMap.get(id));
return true;
}
return false;
} else if (lens === "Unused") {
return getMatchesTotal(r) === 0;
}
return true;
});
},
getFilteredData() {
const {
currentView,
filters
} = this.state;
const brData = App.keepRadiusData;
if (!brData) return [];
let data = [];
if (currentView === CONSTANTS.VIEWS.PACKAGES) {
data = getRuleFiles(brData).filter(f => f.matches.total > 0);
} else {
data = getRules(brData);
// If lens is 'Residual', 'All', or default, show only rules with matches > 0.
// If lens is 'Unused', show only rules with matches === 0.
const lens = filters.keepRules[0];
if (lens === "Residual" || lens === "All" || !lens) {
data = data.filter(r => r.matches.total > 0);
} else if (lens === "Unused") {
data = data.filter(r => r.matches.total === 0);
}
}
// Apply Keep Rules Lens (Filtering)
if (currentView === CONSTANTS.VIEWS.MODULES && filters.keepRules.length >
0) {
data = this.applyKeepRuleLens(data, filters.keepRules[0]);
}
// Apply Class/Field/Method filters
if (filters.classes.length > 0 || filters.fields.length > 0 || filters
.methods.length > 0) {
const matchedRuleIds = new Set();
if (filters.classes.length > 0) {
brData.keptClassInfoTable.forEach(c => {
if (filters.classes.includes(c.id)) {
(c.keptBy || []).forEach(rid => matchedRuleIds.add(rid));
}
});
}
if (filters.fields.length > 0) {
brData.keptFieldInfoTable.forEach(f => {
if (filters.fields.includes(f.id)) {
(f.keptBy || []).forEach(rid => matchedRuleIds.add(rid));
}
});
}
if (filters.methods.length > 0) {
brData.keptMethodInfoTable.forEach(m => {
if (filters.methods.includes(m.id)) {
(m.keptBy || []).forEach(rid => matchedRuleIds.add(rid));
}
});
}
data = data.filter(r => matchedRuleIds.has(r.id));
}
if (this.state.searchTerm) {
const term = this.state.searchTerm.toLowerCase();
data = data.filter(item => item.name.toLowerCase().includes(term));
}
return data;
},
getSortedData(data) {
const {
by,
order
} = this.state.sort;
if (!by) return data;
const getVal = (obj, path) => {
return path.split('.').reduce((o, key) => (o && o[key] !==
undefined) ? o[key] : 0, obj);
};
return [...data].sort((a, b) => {
const vA = getVal(a, by);
const vB = getVal(b, by);
if (typeof vA === "string")
return order === "asc" ? vA.localeCompare(vB) : vB.localeCompare(
vA);
return order === "asc" ? (vA || 0) - (vB || 0) : (vB || 0) - (vA ||
0);
});
},
updateBreadcrumbs() {
const bc = document.getElementById("flat-breadcrumbs");
if (!bc) return;
const linkClass = "breadcrumb-pill";
const textClass = "breadcrumb-text";
const sep = '<span class="text-gray-300 mx-1">/</span>';
let html = "";
const {
module,
pkg: pkg
} = this.state.drillContext;
const toggleText = this.state.statsVisible ? "Hide" :
"Show";
const toggleHtml = `
<button class="dropdown-btn" data-action="toggle-stats" style="border: none; background: transparent; padding: 0.25rem 0.5rem; display: flex; align-items: center; border-radius: 4px; margin-left: auto; cursor: pointer;">
<span style="font-weight: 500; color: var(--text-gray-400);">${toggleText}</span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24"
stroke="currentColor" style="margin-left: 0.25rem; color: var(--text-gray-500); transform: ${this.state.statsVisible ? 'rotate(180deg)' : 'rotate(0deg)'}; transition: transform 0.2s;">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
`;
if (module) {
// Drilled Down Path
html += `<span class="${linkClass}" data-action="reset">R8 Optimization Levels</span>`;
html += sep;
if (pkg) {
html +=
`<span class="${linkClass}" data-action="module" data-val="${escapeHTML(module)}">${escapeHTML(module)}</span>`;
html += sep;
html += `<span class="${textClass}">${escapeHTML(pkg)}</span>`;
} else {
html += `<span class="${textClass}">${escapeHTML(module)}</span>`;
}
} else {
// Global View
html = `<span class="${textClass}">R8 Optimization Levels</span>`;
}
const subtextHtml = `
<div style="font-size: 0.75rem; color: var(--text-gray-500); font-weight: 400; margin-top: 0.25rem; text-transform: none; letter-spacing: normal; padding: 0rem 0.5rem;">
The percentage of your apps codebase that R8 successfully shrinks, optimizes, and obfuscates. Achieving a higher percentage indicates a leaner, more performant application.
</div>
`;
bc.style.display = "flex";
bc.style.alignItems = "center";
bc.style.width = "100%";
bc.innerHTML = `
<div style="display: flex; flex-direction: column; align-items: start;">
<div style="display: flex; align-items: center;">
${html}
</div>
${this.state.statsVisible ? subtextHtml : ''}
</div>
${toggleHtml}
`;
// Breadcrumb Click Handlers
bc.querySelectorAll("[data-action]").forEach((el) => {
el.addEventListener("click", (e) => {
const action = el.dataset.action;
if (action === "reset") {
this.state.drillContext = {
module: null,
pkg: null
};
this.render();
} else if (action === "module") {
this.state.drillContext.pkg = null;
this.render();
} else if (action === "toggle-stats") {
this.state.statsVisible = !this.state.statsVisible;
this.render();
}
});
});
},
render() {
this.updateBreadcrumbs();
if (this.state.currentView === CONSTANTS.VIEWS.FILE_DETAILS) {
App.renderFileDetailsView(this.state.drillContext.fileOriginId);
return;
}
if (this.state.currentView === CONSTANTS.VIEWS.DETAILS) {
return;
}
// Update Label of Group Dropdown
const currentView = this.state.currentView;
const viewLabels = {
modules: "Keep Rules",
packages: "Keep Rule Files"
};
this.elements.grpText.textContent = viewLabels[currentView] || (
currentView.charAt(0).toUpperCase() + currentView.slice(1));
if (this.elements.grpList) {
this.elements.grpList.querySelectorAll(".dropdown-item").forEach((
el) => {
if (el.dataset.value === currentView)
el.classList.add("bg-gray-100", "text-gray-900",
"font-semibold");
else el.classList.remove("bg-gray-100", "text-gray-900",
"font-semibold");
});
}
// Process Data
let data = this.getFilteredData();
data = this.getSortedData(data);
// Update Summary Counts
let relevantClasses = [],
modCount = 0;
if (currentView === CONSTANTS.VIEWS.PACKAGES) {
relevantClasses = data.flatMap((p) => p.classes || []);
modCount = new Set(data.map((p) => p.moduleName)).size;
} else {
relevantClasses = data.flatMap((m) => (m.packages || []).flatMap((p) =>
p.classes || []));
modCount = data.length;
}
// Stats table visibility
if (this.elements.statsContainer) {
this.elements.statsContainer.style.display = this.state.statsVisible ?
"flex" : "none";
this.elements.statsContainer.style.marginBottom = this.state
.statsVisible ? "2rem" : "0";
}
const brData = App.keepRadiusData;
const totalLive = getLiveItemCount(brData);
const formatPerc = (disallowCount) => totalLive > 0 ? (100 - (
disallowCount / totalLive * 100)).toFixed(1) + '%' : '--';
const getPerc = (disallowCount) => totalLive > 0 ? (100 - (disallowCount /
totalLive * 100)) : '--';
const setStatValue = (element, disallowCount) => {
if (!brData) {
element.textContent = '--';
element.className = 'stat-value ' + UIUtils.getScoreClass('--');
return;
}
const perc = getPerc(disallowCount);
element.textContent = formatPerc(disallowCount);
element.className = 'stat-value ' + UIUtils.getScoreClass(perc);
};
setStatValue(this.elements.totalObfuscation, getDisallowObfuscationCount(
brData));
setStatValue(this.elements.totalOptimization,
getDisallowOptimizationCount(brData));
setStatValue(this.elements.totalShrinking, getDisallowShrinkingCount(
brData));
// Render Tables
this.renderHeaders();
this.renderFlatRows(data);
this.renderStatsTable();
},
renderStatsTable() {
const brData = App.keepRadiusData;
if (!brData) return;
const stats = getDetailedStats(brData);
if (!stats) return;
const updateCard = (key) => {
const setStat = (id, disallowCount, total) => {
const el = document.getElementById(id);
const perc = total > 0 ? (100 - (disallowCount / total * 100)) : 100;
if (el) {
el.textContent = perc.toFixed(1) + '%';
}
return perc;
};
const totalPerc = setStat(`card-total-${key}`, stats.overall[key], stats.overall.total);
const updateItem = (type) => {
const bar = document.getElementById(`card-${key}-${type}-bar`);
const val = document.getElementById(`card-${key}-${type}-val`);
if (bar && val) {
const disallow = stats[type][key];
const total = stats[type].total;
const perc = total > 0 ? (100 - (disallow / total * 100)) : 100;
bar.style.width = `${perc}%`;
val.textContent = `${perc.toFixed(1)}%`;
const colorClass = UIUtils.getScoreClass(perc);
if (colorClass.includes('green')) {
bar.style.background = 'var(--text-green-600)';
} else if (colorClass.includes('yellow')) {
bar.style.background = 'var(--text-yellow-600)';
} else if (colorClass.includes('red')) {
bar.style.background = 'var(--text-red-600)';
}
}
};
updateItem("classes");
updateItem("fields");
updateItem("methods");
};
updateCard("obfuscation");
updateCard("optimization");
updateCard("shrinking");
},
renderHeaders() {
const {
currentView,
sort
} = this.state;
const topHeader = document.createElement("tr");
const subHeader = document.createElement("tr");
const viewLabels = {
modules: "RULE",
packages: "KEEP RULE FILES"
};
const title = viewLabels[currentView];
const ind = (key) => {
if (sort.by !== key) return "";
return sort.order === "asc" ?
`<span class="sort-icon text-blue-600 ml-1">▲</span>` :
`<span class="sort-icon text-blue-600 ml-1">▼</span>`;
};
if (currentView === CONSTANTS.VIEWS.PACKAGES) {
topHeader.innerHTML = `
<th rowspan="2" class="text-left sticky-name bg-gray-50 z-30" data-sort-by="name" style="width: 40%; min-width: 300px;">
<div class="flex items-center cursor-pointer hover:text-blue-600" style="padding: 1rem;">
${title}${ind("name")}
</div>
</th>
<th rowspan="2" class="text-center bg-gray-50 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="keepRules" style="padding: 1rem; width: 12%;">Keep Rules${ind("keepRules")}</th>
<th rowspan="2" class="text-center border-l border-gray-200 bg-gray-50 cursor-pointer hover:bg-gray-100" data-sort-by="matches.total" style="padding: 0.5rem; width: 12%;">Kept Items${ind("matches.total")}</th>
<th rowspan="2" class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="impact.obfuscation" style="padding: 0.5rem; width: 12%;">Obfuscation Score${ind("impact.obfuscation")}</th>
<th rowspan="2" class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="impact.optimization" style="padding: 0.5rem; width: 12%;">Optimization Score${ind("impact.optimization")}</th>
<th rowspan="2" class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="impact.shrinking" style="padding: 0.5rem; width: 12%;">Shrinking Score${ind("impact.shrinking")}</th>
`;
subHeader.innerHTML = ``;
} else {
const lens = this.state.filters.keepRules[0];
const isIdenticalLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Identical";
const isSubsumedLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Subsumed";
const isUnusedLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Unused";
if (this.elements.mainTable) {
if (isIdenticalLens || isSubsumedLens || isUnusedLens) {
this.elements.mainTable.style.tableLayout = "fixed";
} else {
this.elements.mainTable.style.tableLayout = "";
}
}
if (isIdenticalLens || isSubsumedLens) {
topHeader.innerHTML = `
<th rowspan="2" class="text-left sticky-name bg-gray-50 z-30" data-sort-by="name" style="width: 50%; min-width: 300px;">
<div class="flex items-center cursor-pointer hover:text-blue-600" style="padding: 1rem;">
${title}${ind("name")}
</div>
</th>
<th rowspan="2" class="text-left bg-gray-50 border-l border-gray-200" style="padding: 1rem; width: 50%;">${isIdenticalLens ? 'Identical Rules' : 'Subsumed By'}</th>
`;
subHeader.innerHTML = '';
} else if (isUnusedLens) {
topHeader.innerHTML = `
<th rowspan="2" class="text-left sticky-name bg-gray-50 z-30" data-sort-by="name" style="width: 50%; min-width: 300px;">
<div class="flex items-center cursor-pointer hover:text-blue-600" style="padding: 1rem;">
${title}${ind("name")}
</div>
</th>
<th rowspan="2" class="text-left bg-gray-50 border-l border-gray-200" style="padding: 1rem; width: 50%;">Origin</th>
`;
subHeader.innerHTML = '';
} else {
topHeader.innerHTML = `
<th rowspan="2" class="text-left sticky-name bg-gray-50 z-30" data-sort-by="name" style="width: 40%; min-width: 300px;">
<div class="flex items-center cursor-pointer hover:text-blue-600" style="padding: 1rem;">
${title}${ind("name")}
</div>
</th>
<th colspan="4" class="text-center border-l border-gray-200 bg-gray-50" style="padding: 0.5rem; width: 40%;">KEPT ITEMS <span style="color: var(--text-muted);text-transform: none;font-weight: 500;">Higher is worse</span> <span class="tooltip-icon" data-tooltip="Items retained in the app due to this rule">?</span></th>
${this.state.showBlockedByRule ? `
<th rowspan="2" class="text-left bg-gray-50" style="padding: 1rem; width: 20%; border-left: 1px solid var(--border-color);">BLOCKED BY RULE <span class="tooltip-icon" data-tooltip="Specific actions blocked by this rule">?</span></th>
` : ''}
`;
subHeader.innerHTML = `
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="matches.total" style="padding: 0.5rem; width: 100px; min-width: 100px;">Total${ind("matches.total")}</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="matches.classes" style="padding: 0.5rem; width: 100px; min-width: 100px;">Classes${ind("matches.classes")}</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="matches.fields" style="padding: 0.5rem; width: 100px; min-width: 100px;">Fields${ind("matches.fields")}</th>
<th class="text-center text-xs font-medium text-gray-500 border-l border-gray-200 cursor-pointer hover:bg-gray-100" data-sort-by="matches.methods" style="padding: 0.5rem; width: 100px; min-width: 100px;">Methods${ind("matches.methods")}</th>
`;
}
}
this.elements.tableHeaders.innerHTML = "";
this.elements.tableHeaders.append(topHeader, subHeader);
},
renderFlatRows(data) {
const {
currentView
} = this.state;
if (!data.length) {
this.elements.tableData.innerHTML =
`<tr><td colspan="10" class="text-center py-8 text-gray-500">No results found.</td></tr>`;
return;
}
const brData = App.keepRadiusData;
const build = brData?.buildInfo || {};
const totalLive = getLiveItemCount(brData);
const renderMatchCell = (count, total) => {
const perc = total > 0 ? (count / total * 100) : 0;
const colorClass = UIUtils.getMatchClass(perc);
return `
<td class="text-center border-l border-gray-200" style="padding: 1rem; width: 12%;">
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<span class="font-medium ${colorClass}">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500 mt-1">${count}</span>
</div>
</td>
`;
};
const renderScoreCell = (disallowCount, total) => {
const perc = total > 0 ? (100 - (disallowCount / total * 100)) : 100;
const colorClass = UIUtils.getScoreClass(perc);
return `
<td class="text-center border-l border-gray-200" style="padding: 1rem; width: 12%;">
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center;">
<span class="font-medium ${colorClass}">${perc.toFixed(1)}%</span>
<span class="text-xs text-gray-500 mt-1">${total - disallowCount}/${total}</span>
</div>
</td>
`;
};
this.elements.tableData.innerHTML = data.map((item) => {
const cleanedName = item.name.trim();
const escapedName = escapeHTML(cleanedName);
let nameCell = "";
if (currentView === CONSTANTS.VIEWS.MODULES) {
const highlightedName = highlightRule(cleanedName);
nameCell = `<td class="sticky-name font-medium hover:underline cursor-pointer" title="${escapedName}" style="padding: 1rem; width: 40%; min-width: 300px; font-family: var(--font-family-mono);" data-rule-id="${item.id}">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0; pointer-events: none;">${highlightedName}</pre>
</td>`;
} else if (currentView === CONSTANTS.VIEWS.PACKAGES) {
nameCell = `<td class="sticky-name font-medium text-blue-600 hover:underline cursor-pointer" title="${escapedName}" style="padding: 1rem; width: 40%; min-width: 300px;" data-file-origin-id="${item.id}">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0; pointer-events: none;">${escapedName}</pre>
</td>`;
} else {
nameCell =
`<td class="sticky-name font-medium text-gray-900" title="${escapedName}" style="padding: 1rem; width: 40%; min-width: 300px;"><pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0;">${escapedName}</pre></td>`;
}
if (currentView === CONSTANTS.VIEWS.PACKAGES) {
const keepRulesCell =
`<td class="text-center border-l border-gray-200 text-sm font-semibold" style="padding: 1rem; width: 12%;">${item.keepRules}</td>`;
const totalKeptCell = renderMatchCell(item.matches.total,
totalLive);
const impactCells = `
${renderScoreCell(item.impact.obfuscation, totalLive)}
${renderScoreCell(item.impact.optimization, totalLive)}
${renderScoreCell(item.impact.shrinking, totalLive)}
`;
return `<tr class="table-row border-b border-gray-200 hover:bg-gray-50">${nameCell}${keepRulesCell}${totalKeptCell}${impactCells}</tr>`;
} else {
const lens = this.state.filters.keepRules[0];
const isIdenticalLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Identical";
const isSubsumedLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Subsumed";
const isUnusedLens = currentView === CONSTANTS.VIEWS.MODULES &&
lens === "Unused";
const customNameCell = `<td class="sticky-name font-medium hover:underline cursor-pointer" title="${escapedName}" style="padding: 1rem; width: 50%; min-width: 300px; font-family: var(--font-family-mono);" data-rule-id="${item.id}">
<pre style="white-space: pre-wrap; font-family: var(--font-family-mono); font-size: 0.8125rem; margin: 0; pointer-events: none;">${highlightRule(cleanedName)}</pre>
</td>`;
if (isIdenticalLens || isSubsumedLens) {
const rules = isIdenticalLens ? item.identicalRules : item
.subsumedByRules;
const rulesHtml = (rules || []).map(r => `
<div style="font-family: var(--font-family-mono); font-size: 0.8125rem; margin-bottom: 0.25rem;">
<pre style="white-space: pre-wrap; margin: 0; color: var(--text-main);">${highlightRule(r.source)}</pre>
</div>
`).join("");
return `<tr class="table-row border-b border-gray-200 hover:bg-gray-50">${customNameCell}<td class="border-l border-gray-200" style="padding: 1rem; vertical-align: top; width: 50%; font-family: var(--font-family-mono);">${rulesHtml}</td></tr>`;
} else if (isUnusedLens) {
const rule = brData.keepRuleKeepRadiusTable.find(r => r.id === item.id) || brData.globalKeepRuleKeepRadiusTable.find(r => r.id === item.id);
const fileOrigin = brData.fileOriginTable.find(f => f.id === rule?.origin?.fileOriginId);
let originStr = "Unknown";
if (fileOrigin) {
const mavenName = formatMavenCoordinate(fileOrigin.mavenCoordinate);
originStr = `${mavenName || fileOrigin.filename}:${rule.origin?.lineNumber || 1}`;
}
return `<tr class="table-row border-b border-gray-200 hover:bg-gray-50">${customNameCell}<td class="border-l border-gray-200" style="padding: 1rem; width: 50%; font-family: var(--font-family-mono);">${escapeHTML(originStr)}</td></tr>`;
}
const impact = item.impact || [];
const getTag = (c, label) => {
const isRestricted = impact.includes(c);
const color = isRestricted ? "oklch(0.446 0.043 257.281)" : "#cbd5e1";
const bgColor = isRestricted ? "oklch(0.984 0.003 247.858)" : "#f8fafc";
const borderColor = isRestricted ? "oklch(0.929 0.013 255.508)" : "#e2e8f0";
return `<span class="impact-tag" style="display: inline-block; color: ${color}; background-color: ${bgColor}; border: 1px solid ${borderColor}; border-radius: 4px; padding: 2px 8px; font-size: 10px; font-weight: 400; height: 21px; line-height: 15px; text-transform: uppercase; letter-spacing: 0.25px; box-sizing: border-box; text-align: center;">${label}</span>`;
};
const impactCell = `
<td style="padding: 1rem; border-left: 1px solid var(--border-color);">
<div class="flex justify-start" style="gap: 0.5rem;">
${getTag('DONT_OBFUSCATE', 'OBFUSCATE')}
${getTag('DONT_OPTIMIZE', 'OPTIMIZE')}
${getTag('DONT_SHRINK', 'SHRINK')}
</div>
</td>
`;
const matchesCells = `
${renderMatchCell(item.matches.total, totalLive)}
${renderMatchCell(item.matches.classes, build.liveClassCount || 0)}
${renderMatchCell(item.matches.fields, build.liveFieldCount || 0)}
${renderMatchCell(item.matches.methods, build.liveMethodCount || 0)}
`;
return `<tr class="table-row border-b border-gray-200 hover:bg-gray-50">${nameCell}${matchesCells}${this.state.showBlockedByRule ? impactCell : ''}</tr>`;
}
}).join("");
},
};
document.addEventListener("DOMContentLoaded", () => {
App.init();
});
</script>
<script>// Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/**
* Utility functions for analyzing keep radius data.
*/
function hasGlobalRule(data, ruleName) {
if (!data || !data.globalKeepRuleKeepRadiusTable) return false;
return data.globalKeepRuleKeepRadiusTable.some(r => r.source === ruleName);
}
function getDisallowObfuscationCount(data) {
if (hasGlobalRule(data, '-dontobfuscate')) {
return getLiveItemCount(data);
}
return getScore(data, 'DONT_OBFUSCATE');
}
function getDisallowOptimizationCount(data) {
if (hasGlobalRule(data, '-dontoptimize')) {
return getLiveItemCount(data);
}
return getScore(data, 'DONT_OPTIMIZE');
}
function getDisallowShrinkingCount(data) {
if (hasGlobalRule(data, '-dontshrink')) {
return getLiveItemCount(data);
}
return getScore(data, 'DONT_SHRINK');
}
function getLiveItemCount(data) {
if (!data || !data.buildInfo) return 0;
return (data.buildInfo.liveClassCount || 0) +
(data.buildInfo.liveFieldCount || 0) +
(data.buildInfo.liveMethodCount || 0);
}
/**
* Returns detailed counts for the stats table.
*/
function getDetailedStats(data) {
if (!data) return null;
const build = data.buildInfo || {};
const stats = {
classes: { total: build.liveClassCount || 0, obfuscation: 0, optimization: 0, shrinking: 0 },
fields: { total: build.liveFieldCount || 0, obfuscation: 0, optimization: 0, shrinking: 0 },
methods: { total: build.liveMethodCount || 0, obfuscation: 0, optimization: 0, shrinking: 0 },
overall: { total: getLiveItemCount(data), obfuscation: 0, optimization: 0, shrinking: 0 }
};
const constraintsMap = getConstraintsMap(data);
const rulesMap = getRulesConstraintsMap(data);
const hasObfuscate = hasGlobalRule(data, '-dontobfuscate');
const hasOptimize = hasGlobalRule(data, '-dontoptimize');
const hasShrink = hasGlobalRule(data, '-dontshrink');
const processTable = (table, key, forcedObfuscation, forcedOptimization, forcedShrinking) => {
if (forcedObfuscation) {
stats[key].obfuscation = stats[key].total;
}
if (forcedOptimization) {
stats[key].optimization = stats[key].total;
}
if (forcedShrinking) {
stats[key].shrinking = stats[key].total;
}
if (!forcedObfuscation || !forcedOptimization || !forcedShrinking) {
if (!table) return;
table.forEach(item => {
const keptBy = item.keptBy || [];
const constraints = keptBy.flatMap(ruleId => constraintsMap.get(rulesMap.get(ruleId)) || []);
if (!forcedObfuscation && constraints.includes('DONT_OBFUSCATE')) stats[key].obfuscation++;
if (!forcedOptimization && constraints.includes('DONT_OPTIMIZE')) stats[key].optimization++;
if (!forcedShrinking && constraints.includes('DONT_SHRINK')) stats[key].shrinking++;
});
}
};
processTable(data.keptClassInfoTable, 'classes', hasObfuscate, hasOptimize, hasShrink);
processTable(data.keptFieldInfoTable, 'fields', hasObfuscate, hasOptimize, hasShrink);
processTable(data.keptMethodInfoTable, 'methods', hasObfuscate, hasOptimize, hasShrink);
stats.overall.obfuscation = stats.classes.obfuscation + stats.fields.obfuscation + stats.methods.obfuscation;
stats.overall.optimization = stats.classes.optimization + stats.fields.optimization + stats.methods.optimization;
stats.overall.shrinking = stats.classes.shrinking + stats.fields.shrinking + stats.methods.shrinking;
return stats;
}
function getConstraintsMap(data) {
const constraintsMap = new Map();
if (data.keepConstraintsTable) {
data.keepConstraintsTable.forEach(c => {
constraintsMap.set(c.id, c.constraints || []);
});
}
return constraintsMap;
}
function getRulesConstraintsMap(data) {
const rulesMap = new Map();
if (data.keepRuleKeepRadiusTable) {
data.keepRuleKeepRadiusTable.forEach(r => {
rulesMap.set(r.id, r.constraintsId);
});
}
return rulesMap;
}
function getImpactArray(constraints) {
if (!constraints) return [];
return constraints;
}
/**
* Returns formatted rules for the table.
*/
function getRules(data) {
if (!data || !data.keepRuleKeepRadiusTable) return [];
const constraintsMap = getConstraintsMap(data);
const rules = data.keepRuleKeepRadiusTable.map(rule => {
const constraints = constraintsMap.get(rule.constraintsId);
const br = rule.keepRadius || {};
const classes = (br.classKeepRadius || []).length;
const fields = (br.fieldKeepRadius || []).length;
const methods = (br.methodKeepRadius || []).length;
return {
id: rule.id,
name: rule.source,
impact: getImpactArray(constraints),
matches: {
classes,
fields,
methods,
total: classes + fields + methods
},
subsumedBy: br.subsumedBy || []
};
});
if (data.globalKeepRuleKeepRadiusTable) {
const totalClasses = data.buildInfo?.liveClassCount || 0;
const totalFields = data.buildInfo?.liveFieldCount || 0;
const totalMethods = data.buildInfo?.liveMethodCount || 0;
const totalLive = totalClasses + totalFields + totalMethods;
data.globalKeepRuleKeepRadiusTable.forEach(rule => {
if (rule.source === '-dontoptimize' || rule.source === '-dontshrink' || rule.source === '-dontobfuscate') {
const constraints = [...(constraintsMap.get(rule.constraintsId) || [])];
if (rule.source === '-dontobfuscate' && !constraints.includes('DONT_OBFUSCATE')) {
constraints.push('DONT_OBFUSCATE');
}
if (rule.source === '-dontoptimize' && !constraints.includes('DONT_OPTIMIZE')) {
constraints.push('DONT_OPTIMIZE');
}
if (rule.source === '-dontshrink' && !constraints.includes('DONT_SHRINK')) {
constraints.push('DONT_SHRINK');
}
rules.push({
id: rule.id,
name: rule.source,
impact: getImpactArray(constraints),
matches: {
classes: totalClasses,
fields: totalFields,
methods: totalMethods,
total: totalLive
},
subsumedBy: []
});
}
});
}
return rules;
}
/**
* Returns formatted files (origins) for the table.
*/
function getRuleFiles(data) {
if (!data || !data.fileOriginTable || !data.keepRuleKeepRadiusTable) return [];
const fileMap = new Map();
const constraintsMap = getConstraintsMap(data);
data.fileOriginTable.forEach(f => {
const mavenName = formatMavenCoordinate(f.mavenCoordinate);
fileMap.set(f.id, {
id: f.id,
name: mavenName || f.filename,
keepRules: 0,
matches: { classes: new Set(), fields: new Set(), methods: new Set() },
impact: {
obfuscation: new Set(),
optimization: new Set(),
shrinking: new Set()
}
});
});
data.keepRuleKeepRadiusTable.forEach(rule => {
const fileId = rule.origin?.fileOriginId;
const fileEntry = fileMap.get(fileId);
if (fileEntry) {
fileEntry.keepRules++;
const br = rule.keepRadius || {};
const c = br.classKeepRadius || [];
const f = br.fieldKeepRadius || [];
const m = br.methodKeepRadius || [];
c.forEach(id => fileEntry.matches.classes.add(id));
f.forEach(id => fileEntry.matches.fields.add(id));
m.forEach(id => fileEntry.matches.methods.add(id));
const constraints = constraintsMap.get(rule.constraintsId) || [];
if (constraints.includes('DONT_OBFUSCATE')) {
c.forEach(id => fileEntry.impact.obfuscation.add('c' + id));
f.forEach(id => fileEntry.impact.obfuscation.add('f' + id));
m.forEach(id => fileEntry.impact.obfuscation.add('m' + id));
}
if (constraints.includes('DONT_OPTIMIZE')) {
c.forEach(id => fileEntry.impact.optimization.add('c' + id));
f.forEach(id => fileEntry.impact.optimization.add('f' + id));
m.forEach(id => fileEntry.impact.optimization.add('m' + id));
}
if (constraints.includes('DONT_SHRINK')) {
c.forEach(id => fileEntry.impact.shrinking.add('c' + id));
f.forEach(id => fileEntry.impact.shrinking.add('f' + id));
m.forEach(id => fileEntry.impact.shrinking.add('m' + id));
}
}
});
if (data.globalKeepRuleKeepRadiusTable) {
data.globalKeepRuleKeepRadiusTable.forEach(rule => {
const fileId = rule.origin?.fileOriginId;
const fileEntry = fileMap.get(fileId);
if (fileEntry) {
fileEntry.keepRules++;
}
});
}
return Array.from(fileMap.values()).map(f => ({
id: f.id,
name: f.name,
keepRules: f.keepRules,
matches: {
classes: f.matches.classes.size,
fields: f.matches.fields.size,
methods: f.matches.methods.size,
total: f.matches.classes.size + f.matches.fields.size + f.matches.methods.size
},
impact: {
obfuscation: f.impact.obfuscation.size,
optimization: f.impact.optimization.size,
shrinking: f.impact.shrinking.size
}
}));
}
function formatDescriptor(desc) {
if (!desc) return "Unknown";
let dimensions = 0;
while (desc[dimensions] === '[') {
dimensions++;
}
let base = desc.substring(dimensions);
let res = "";
if (base.startsWith('L') && base.endsWith(';')) {
res = base.substring(1, base.length - 1).replace(/\//g, '.');
} else if (base.length === 1) {
switch (base[0]) {
case 'V':
res = "void";
break;
case 'Z':
res = "boolean";
break;
case 'B':
res = "byte";
break;
case 'S':
res = "short";
break;
case 'C':
res = "char";
break;
case 'I':
res = "int";
break;
case 'J':
res = "long";
break;
case 'F':
res = "float";
break;
case 'D':
res = "double";
break;
default:
res = base;
}
} else {
res = base;
}
for (let i = 0; i < dimensions; i++) {
res += "[]";
}
return res;
}
function formatMethodName(methodRef, dataOrLookups, typeRefMap) {
if (!methodRef) return "Unknown method";
if (dataOrLookups && dataOrLookups.typeReference) {
const lookups = dataOrLookups;
const className = formatDescriptor(lookups.typeReference.get(methodRef.classReferenceId));
const proto = lookups.protoReference.get(methodRef.protoReferenceId);
let params = "";
if (proto && proto.parametersId) {
const list = lookups.typeReferenceList.get(proto.parametersId);
if (list && list.typeReferenceIds) {
params = list.typeReferenceIds.map(id => formatDescriptor(lookups.typeReference.get(id))).join(', ');
}
}
return `${className}.${methodRef.name}(${params})`;
}
const data = dataOrLookups;
const className = formatDescriptor(typeRefMap.get(methodRef.classReferenceId));
const proto = (data.protoReferenceTable || []).find(p => p.id === methodRef.protoReferenceId);
let params = "";
if (proto && proto.parametersId) {
const list = (data.typeReferenceListTable || []).find(l => l.id === proto.parametersId);
if (list && list.typeReferenceIds) {
params = list.typeReferenceIds.map(id => formatDescriptor(typeRefMap.get(id))).join(', ');
}
}
return `${className}.${methodRef.name}(${params})`;
}
function formatFieldName(fieldRef, dataOrLookups, typeRefMap) {
if (!fieldRef) return "Unknown field";
if (dataOrLookups && dataOrLookups.typeReference) {
const lookups = dataOrLookups;
const className = formatDescriptor(lookups.typeReference.get(fieldRef.classReferenceId));
return `${className}.${fieldRef.name}`;
}
const className = formatDescriptor(typeRefMap.get(fieldRef.classReferenceId));
return `${className}.${fieldRef.name}`;
}
function formatMavenCoordinate(m) {
if (!m || !m.groupId) return null;
return `${m.groupId}:${m.artifactId}:${m.version}`;
}
function escapeHTML(str) {
if (!str) return "";
return str.replace(/[&<>"']/g, function (m) {
return {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
}[m];
});
}
function highlightRule(source) {
if (!source) return "";
const escapedSource = escapeHTML(source);
// Highlight semicolon FIRST with negative lookbehind so we don't match inside subsequently inserted HTML tags or existing HTML entities
return escapedSource
.replace(/(?<!&[a-zA-Z0-9#]+);/g, '<span style="color: #ca8a04;">;</span>')
.replace(/([{}*])/g, '<span style="color: #ca8a04;">$1</span>')
.replace(/(-keep[a-z]*|-dontoptimize|-dontshrink|-dontobfuscate)/g, '<span style="color: #dc2626;">$1</span>')
.replace(/\b(class|interface|enum)\b/g, '<span style="color: #2563eb;">$1</span>');
}
/**
* Shared helper to count kept items that have a specific constraint.
* An item is counted if ANY of the keep rules that keep it has the specified constraint.
*/
function getScore(data, constraintName) {
if (!data) return 0;
const constraintsMap = getConstraintsMap(data);
const rulesMap = getRulesConstraintsMap(data);
let count = 0;
const tables = [
data.keptClassInfoTable,
data.keptFieldInfoTable,
data.keptMethodInfoTable
];
tables.forEach(table => {
if (table) {
table.forEach(item => {
const hasRuleWithConstraint = (item.keptBy || []).some(ruleId => {
const constraintsId = rulesMap.get(ruleId);
const constraints = constraintsMap.get(constraintsId);
return constraints && constraints.includes(constraintName);
});
if (hasRuleWithConstraint) {
count++;
}
});
}
});
return count;
}</script>
<!-- Help Hub FAB -->
<button id="help-hub-fab" class="fab">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span>Help</span>
</button>
<!-- Help Hub Side Panel -->
<div id="help-hub-panel" class="side-panel">
<div class="side-panel-header">
<div class="header-left">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<h2>Help</h2>
</div>
<button id="close-help-hub" class="icon-btn">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<div class="side-panel-content">
<!-- Introduction -->
<div class="help-section">
<div class="help-section-title">Introduction to Table Data</div>
<p>R8 is Android's code shrinker, optimizer, and obfuscator. This report shows how your keep rules constrain R8
— every kept item is one R8 couldn't shrink, optimize, or obfuscate. Higher percentages mean more of your app
is locked in place.</p>
</div>
<div class="divider"></div>
<!-- Legend -->
<div class="help-section">
<div class="help-section-title">Legend</div>
<div class="legend-list">
<!-- Obfuscation Score -->
<div class="legend-item" data-topic="obfuscation-score">
<div class="legend-item-header">
<span class="legend-item-title">Obfuscation Score</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
% of classes/fields/methods R8 was free to rename. Higher = better.
</div>
</div>
<!-- Optimization Score -->
<div class="legend-item" data-topic="optimization-score">
<div class="legend-item-header">
<span class="legend-item-title">Optimization Score</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
% of classes/fields/methods R8 was free to optimize. Higher = better.
</div>
</div>
<!-- Shrinking Score -->
<div class="legend-item" data-topic="shrinking-score">
<div class="legend-item-header">
<span class="legend-item-title">Shrinking Score</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
% of classes/fields/methods R8 was free to remove. Higher = better.
</div>
</div>
<!-- Kept Items -->
<div class="legend-item" data-topic="kept-items">
<div class="legend-item-header">
<span class="legend-item-title">Kept Items (higher is worse)</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Total number of items kept by this rule. Higher numbers indicate a larger impact on APK size.
</div>
</div>
<!-- Blocked By Rule -->
<div class="legend-item" data-topic="blocked-by-rule">
<div class="legend-item-header">
<span class="legend-item-title">Blocked By Rule</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Specific actions blocked by this rule (e.g., Optimization, Shrinking).
</div>
</div>
<!-- Identical Rules -->
<div class="legend-item" data-topic="identical-rules">
<div class="legend-item-header">
<span class="legend-item-title">Identical Rules</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Rules that match the exact same set of items.
</div>
</div>
<!-- Subsumed By -->
<div class="legend-item" data-topic="subsumed-by">
<div class="legend-item-header">
<span class="legend-item-title">Subsumed By</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Rules that are covered by a broader rule.
</div>
</div>
<!-- Unused Rules -->
<div class="legend-item" data-topic="unused-rules">
<div class="legend-item-header">
<span class="legend-item-title">Unused Rules</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Rules that do not match any items in the application.
</div>
</div>
<!-- Lenses -->
<div class="legend-item" data-topic="lenses">
<div class="legend-item-header">
<span class="legend-item-title">Lenses (All / Identical / Subsumed / Unused)</span>
<svg class="legend-item-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</div>
<div class="legend-item-content">
Different perspectives to view the rules.
</div>
</div>
</div>
</div>
<div class="divider"></div>
<!-- Documentation -->
<div class="help-section">
<div class="help-section-title">Documentation</div>
<div class="doc-list">
<a href="https://r8.googlesource.com/r8/" target="_blank" class="doc-card">
<div class="doc-card-info">
<span class="doc-card-title">R8 keep rule reference</span>
<span class="doc-card-domain">developer.android.com</span>
<span class="doc-card-desc">Official guide to shrinking, obfuscation, and optimization with R8.</span>
</div>
<svg class="doc-card-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
<a href="https://developer.android.com/studio/build/shrink-code" target="_blank" class="doc-card">
<div class="doc-card-info">
<span class="doc-card-title">Reduce APK size</span>
<span class="doc-card-domain">developer.android.com</span>
<span class="doc-card-desc">Patterns and tools for minimizing the footprint of your release build.</span>
</div>
<svg class="doc-card-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"
viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
</div>
</div>
</div>
</div>
</body>
</html>