Der ultimative Guide zu Google Updates

Die Algorithmen von Google sind ein komplexes System, das dazu dient, Daten aus seinem Suchindex abzurufen und sofort die bestmöglichen Ergebnisse für eine Suchanfrage zu liefern. Die Suchmaschine verwendet eine Kombination aus Algorithmen und zahlreichen Ranking-Faktoren, um Webseiten auf den Suchergebnisseiten (SERPs) nach Relevanz zu sortieren.

In den Anfangsjahren nahm Google nur eine Handvoll Aktualisierungen an seinen Algorithmen vor. Heute nimmt Google jedes Jahr Tausende von Änderungen vor.

Die meisten dieser Aktualisierungen sind so geringfügig, dass sie völlig unbemerkt bleiben. Gelegentlich führt die Suchmaschine jedoch größere Algorithmus-Updates durch, die sich erheblich auf die SERPs auswirken.

Warum gibt es Google Updates?

Das Hauptziel von Google ist es, seinen Nutzern die bestmöglichen Suchergebnisse zu liefern. Um dieses Ziel zu erreichen, werden die Algorithmen ständig weiterentwickelt. Dies geschieht aus verschiedenen Gründen:

  • Verbesserung der Relevanz: Google möchte sicherstellen, dass die angezeigten Ergebnisse so genau und relevant wie möglich auf die Suchanfrage zugeschnitten sind.
  • Bekämpfung von Spam und minderwertigen Inhalten: Updates zielen darauf ab, Websites mit manipulativem SEO oder schlechten Inhalten abzuwerten, um die Qualität der Suchergebnisse zu erhöhen.
  • Anpassung an das Nutzerverhalten: Das Suchverhalten der Nutzer ändert sich ständig (z.B. durch die Zunahme mobiler Suchen). Google-Updates reagieren auf diese Veränderungen.
  • Einführung neuer Technologien: Google integriert kontinuierlich neue Technologien und Konzepte (z.B. Künstliche Intelligenz), die sich in den Algorithmen widerspiegeln.

Arten von Google Updates

Google unterscheidet grundsätzlich zwischen verschiedenen Arten von Updates:

  • Core Updates (Kern-Updates): Dies sind die größten und weitreichendsten Updates, die mehrmals im Jahr ausgerollt werden. Sie betreffen den gesamten Suchalgorithmus und können zu signifikanten Ranking-Schwankungen führen. Google kündigt Core Updates in der Regel vorab an, gibt aber selten detaillierte Informationen zu den genauen Änderungen bekannt.
  • Produkt- und Feature-Updates: Diese Updates konzentrieren sich auf bestimmte Aspekte des Algorithmus oder auf neue Funktionen in den Suchergebnissen (z.B. Änderungen an den Rich Snippets, Local Pack Updates).
  • Spam Updates: Diese Updates sind spezifisch darauf ausgelegt, Spam-Techniken zu bekämpfen und die Qualität der Suchergebnisse zu verbessern, indem sie Websites mit manipulativen Praktiken abwerten.
  • Unangekündigte, kleinere Updates: Google nimmt ständig kleinere Anpassungen am Algorithmus vor, die oft unbemerkt bleiben oder nur geringfügige Auswirkungen haben. Diese werden nicht offiziell kommuniziert.

Übersicht über die wichtigsten Google Updates

Google Panda (Februar 2011)

Dieses Update zielte darauf ab, Websites mit niedrigwertigen Inhalten zu bestrafen und Websites mit hochwertigen Inhalten zu belohnen.

Google Penguin (April 2012)
Das Ziel dieses Updates war es, Websites zu bestrafen, die versuchen, die Suchmaschinenrankings durch den Einsatz übermäßiger oder manipulativer Linkpraktiken zu beeinflussen.

Google Hummingbird (August 2013)
Dieses Update führte eine verbesserte Verarbeitung natürlicher Sprache und semantische Suche ein, um die Absicht hinter Suchanfragen besser zu verstehen.

Google Pigeon (Juli 2014)
Dieses Update verbesserte die lokalen Suchergebnisse und integrierte sie besser in die traditionellen Web-Suchsignalparameter.
Google Mobile Friendly Update (April 2015): Auch bekannt als “Mobilegeddon”, dieses Update bevorzugte Websites, die auf Mobilgeräten gut aussahen und funktionierten.

Google RankBrain (Oktober 2015)
Ein maschinelles Lernsystem, das dazu beiträgt, die Bedeutung von Suchanfragen zu verstehen.

Google Possum (September 2016)
Dieses Update änderte die Art und Weise, wie der Standort des Suchenden die Suchergebnisse beeinflusst.

Google Fred (März 2017)
Ein Update, das Websites bestraft, die qualitativ hochwertigen Inhalt zugunsten von Affiliate-Links und Anzeigen übergehen.

Google Mobile First Indexing (März 2018)
Google begann, die mobile Version von Websites für die Indexierung und das Ranking zu verwenden.

Google BERT (Oktober 2019)
Ein Update zur Verbesserung des Verständnisses von natürlicher Sprache in Suchanfragen, insbesondere für längere, gesprächigere Anfragen.

Google Core Updates (regelmäßig)
Diese Updates beziehen sich auf Änderungen an den Haupt-Algorithmen und Systemen von Google, die dazu dienen, Suchergebnisse zu ranken. Sie treten mehrmals im Jahr auf.

Google Page Experience Update (Mai 2021)
Dieses Update konzentriert sich auf die Nutzererfahrung auf Websites, einschließlich Ladezeit, Interaktivität und Stabilität visueller Inhalte.

Google Helpful Content Update (August 2022)
Dieses Update wurde eingeführt, um Inhalte zu fördern, die primär für Nutzer erstellt wurden, und solche abzuwerten, die hauptsächlich für Suchmaschinenoptimierung (SEO) verfasst wurden. Ziel war es, „People-first“-Content zu belohnen und „SEO-first“-Inhalte zu benachteiligen.

Generative KI & AI Overviews (seit 2024)
Google hat mit der Einführung von AI Overviews begonnen, die Suchergebnisse zusammenfassen und oberhalb der traditionellen Suchergebnisse anzeigen. Diese Entwicklung hat zu einem Rückgang des organischen Traffics für viele Nachrichten-Websites geführt, da Nutzer zunehmend auf die zusammengefassten Antworten vertrauen.

Das Panda Update

All das änderte sich grundlegend im Februar 2011 mit Googles Panda-Update. Google hatte das Problem erkannt und wollte mit diesem Update die Qualität der Inhalte verbessern, damit auch Nutzer von der Qualität der Texte profitieren können. Wer also schlechten Content hatte oder ihn vor seinen Nutzern versteckte, der war klarer Verlierer des Panda-Updates. Bis 2016 gab es immer wieder neue Versionen dieses Updates, um zu erreichen, dass der Content immer besser wurde.

Seit 2016 sind die Kriterien des Panda-Updates nun in den sogenannten Core-Algorithmus von Google übergegangen. Das heißt, sie werden immer weiter verfeinert und sehr regelmäßig ausgerollt. Der Vorteil ist, dass man nicht auf das nächste Update warten muss, um Ranking-Verbesserungen durch Optimierungen zu erhalten.

Über das Google Panda-Update

Beim Panda-Update handelt es sich um einen Filter, der regelmäßig auf den gesamten Google-Index angewandt wird und qualitativ schlechte Webseiten in ihrer Sichtbarkeit deutlich herabsetzt, also deren Platzierungen in den Suchergebnisseiten deutlich nach hinten verschiebt.

Die Algorithmus-Änderung wurde erstmals am 23.02.2011 auf dem US-amerikanischen Markt eingeführt und am 11.04.2011 dann weltweit für alle Suchanfragen in englischer Sprache ausgespielt.

Am 12.08.2011 wurde die Änderung am Ranking-Algorithmus weltweit für alle verfügbaren Sprachen, ausgenommen Chinesisch, Japanisch und Koreanisch, übernommen. In diesem Zusammenhang spricht man von der weltweiten Veröffentlichung des Google Panda-Updates.

Namensgeber der Algorithmus-Änderung ist übrigens nicht wie häufig vermutet der Panda-Bär sondern der Google-Ingenieur Navneet Panda, dessen Beitragmaßgeblich für die Fertigstellung dieses Filters verantwortlich war.

Weitere Verbesserung mit dem Hummingbird-Update

Im August 2013 nahm sich Google mithilfe seines Hummingbird-Updates explizit die Falschschreibweisen und Synonyme von Keywords vor. Seitdem erkennt Google semantische Zusammenhänge viel besser und man braucht für jedes Thema nur noch eine Seite.

Ziel von Googles neuem Such-Algorithmus „Hummingbird“ war es, Such-Anfragen der User besser interpretieren zu können und somit die Qualität der Suchergebnisse zu verbessern.

Der Kodename “Hummingbird” (deutsch: „Kolibri“) soll darauf hinweisen, dass die Suchergebnisse künftig schnell und präzise präsentiert werden.

Der neue Such-Algorithmus vermag die gesamte Suchanfrage (besser) zu interpretieren, statt wie bisher nur nach einzelnen Wörtern innerhalb der Suchanfrage zu suchen. Google versteht die Intention einer Suchanfrage sowie den Inhalt eines Webdokuments damit noch besser. Diese beiden Faktoren sind grundlegende Faktoren für eine Verbesserung der Suchergebnisse.

Über das Hummingbird Update

“Hummingbird wirkt sich auf alle Arten von Anfragen aus, aber es ist besonders effektiv bei langen Anfragen, die immer mehr zunehmen.”

– Amit Singhal, Google VP Software Engineer

Was ist das Google-Hummingbird-Update?

Zum 15-jährigen Bestehen der Google-Suche wurde am 26. September 2013 bekanntgegeben, dass Google seinen Such-Algorithmus einer tiefgreifenden Überarbeitung unterzogen hat und bereits seit August 2013 ein neuer Algorithmus, Hummingbird, die Grundlage der gesamten Google-Suche bildet.

Warum war diese Algorithmus-Änderung so besonders?

Das Google-Hummingbird-Update unterscheidet sich von anderen Google Algorithmus-Änderungen, da es sich um einen vollkommem neuen Such-Algorithmus handelt, der die Grundlage der Google-Suche bildet. Google-Updates wie das Panda Update oder das Penguin Update waren bedeutende Änderungen (Updates) an Googles Ranking-Algorithmus – welcher ein Teil des Such-Algorithmus darstellt.
Zuletzt hatte Google im Jahre 2010 mit dem Google Caffeine Update eine ähnlich bedeutend große Änderung durchgeführt. Laut dem damaligen Leiter von Google Such-Team, Amit Singhal, wurde zuletzt 2001 ein Google Algorithmus so grundlegend geändert.

Was war das Ziel des Hummingbird-Updates?

Ziel von Googles neuem Such-Algorithmus „Hummingbird“ war es, Such-Anfragen der User besser interpretieren zu können und somit die Qualität der Suchergebnisse zu verbessern.

Der Kodename “Hummingbird” soll darauf hinweisen, dass die Suchergebnisse künftig so schnell und präzise sind wie ein Kolibri.
Der neue Such-Algorithmus vermag die gesamte Suchanfrage inhaltlich zu interpretieren, statt wie bisher nur nach einzelnen Wörtern innerhalb der Suchanfrage zu suchen. Google versteht die Intention einer Suchanfrage sowie den Inhalt eines Webdokuments damit noch besser. Diese beiden Faktoren sind grundlegende Faktoren für eine Verbesserung der Suchergebnisse.

Hummingbird schenkt also jedem Wort in einer Suche mehr Aufmerksamkeit und stellt sicher, dass die gesamte Abfrage berücksichtigt wird, und nicht nur bestimmte Wörter. Das Ziel ist, dass die Seiten, die der Bedeutung entsprechen, besser abschneiden, als Seiten, die nur einige wenige Wörter enthalten. Hummingbird war also der endgültige Einstieg in die Semantische Suche.

Wie äußerte sich das Hummingbird-Update?

Laut Google soll das Hummingbird-Update die Qualität der Suchergebnisse bei langen und komplexen Suchanfragen enorm verbessern. Bei diesen Suchanfragen wird die gesamte Suchanfrage des Users besser interpretiert und entsprechend relevantere Ergebnisse zurückgegeben. Die Suchergebnisse werden demnach anders als zuvor sortiert und sorgen letztendlich für eine zielgenauere Antwort.

Waren andere Google-Updates damit jetzt unwichtig?

Da es sich beim Hummingbird-Update um einen gänzlich neu entwickelten Algorithmus handelt, der fortan die Basis der Google-Suche bildete, wurden andere Ranking-Algorithmen wie Panda und Penguin höchstwahrscheinlich als elementarer Bestandteil des Such-Algorithmus in diesen integriert.

Kampf dem Spam mit Penguin

Im Jahr 2012 führte Google offiziell das “Webspam-Algorithmus-Update” ein, das speziell auf Link-Spam und manipulative Linkbuilding-Praktiken abzielte.

Der Webspam-Algorithmus wurde später durch einen Tweet von Matt Cutts, dem damaligen Leiter des Google Webspam-Teams, (offiziell) als Penguin-Algorithmus-Update bekannt.

Obwohl Google den Algorithmus offiziell Penguin nannte, ist nicht bekannt, woher dieser Name stammt.

Zehn Jahre sind vergangen, seit Google den Penguin-Algorithmus eingeführt und eine härtere Gangart gegenüber manipulativen Linkbuilding-Praktiken eingeschlagen hat.

Der Algorithmus wurde mehrfach aktualisiert und ist zu einem Echtzeitbestandteil des Google-Kernalgorithmus geworden. Infolgedessen sind Abstrafungen seltener geworden, sie existieren aber immer noch sowohl in in Bezig auf einzelne URL als auch auf komplette Domains.

Im Großen und Ganzen behauptet Google, viele minderwertige Online-Links zu ignorieren, ist aber immer noch wachsam und achtet auf unnatürliche Muster wie Linkschemata, PBNs, Linktausch und unnatürliche ausgehende Verlinkungsmuster.

RankBrain

Anfang 2015 rollte Google dann RankBrain aus. RankBrain wurde von Google direkt als drittwichtigster Ranking-Faktor bezeichnet.

RankBrain bezieht sich auf einen von Google eingesetzten Algorithmus, der mit Hilfe von maschinellem Lernen und Künstlicher Intelligenz vor allem relevante Suchergebnisse für bisher unbeantwortete Suchanfragen liefern soll.

Der große Unterschied zu den Google-Updates bis dato besteht darin, dass das RankBrain selbst neu dazulernt und die Anpassungen des Algorithmus nicht durch Menschen vollzogen werden.

Unter SEOs gibt es eine Diskussion, wie RankBrain in die Systematik der Google Updates einzuordnen ist. Manche SEOs – etwa Danny Sullivan von SearchEngineLand – bezeichnen RankBrain als Teil des Hummingbird Suchalgorithmus.

Letztlich ist auch RankBrain ein weiterer Schritt, um die Semantik von Sprache besser zu verstehen. Google brachte diese Fähigkeit mit den Worten „things not strings“ auf einen einfachen Nenner. Demnach kann Google seit RankBrain nicht nur „strings“, also Ketten von Wörtern, finden, sondern auch „things“, also die Bedeutung von Wörtern erkennen.

Auch wenn RankBrain Platz drei in der Rangliste der Google-Ranking-Faktoren einnimmt, bleibt er nur einer von mehreren hundert Faktoren, anhand derer Google die Relevanz und Qualität einer Website in Bezug auf eine Suchanfrage bestimmt und die Suchergebnisse entsprechend berechnet.

Dann kam BERT

Mit dem BERT Update versucht Google den Kontext innerhalb einer Suchanfrage besser zu erkennen und entsprechend passende Ergebnisse zu liefern. Bert ist die größte Algorithmus-Änderung seit Hummingbird und betrifft jede zehnte Suchanfrage.

Mit dem Google BERT Update will Google das Verständnis von komplexen Long-Tail-Suchanfragen verbessern und relevantere Ergebnisse anzeigen. Mithilfe von Natural Language Processing kann Google jetzt den semantischen Kontext einer Suchanfrage viel besser verstehen.

BERT ist also eine Weiterentwicklung von Panda, Hummingbird und Rank Brain. Auch mit BERT versucht Google den Kontext innerhalb einer Suchanfrage zu erkennen und passende Ergebnisse zu liefern.

Wie inzwischen bei allen Updates, betont Google, dass es keine Notwendigkeit oder auch Möglichkeit gibt, auf das BERT Update direkt zu reagieren. Vielmehr sei es mehr denn je von entscheidender Wichtigkeit hochwertige Inhalte zu erstellen und die Nutzer glücklich zu machen.

Fred Update gegen Websites mit minderwertiger Qualität

Mit der Aktualisierung des Google-Algorithmus Fred wurde versucht, die von Google als minderwertig eingestuften Ergebnisse zu entfernen, d. h. Websites, die auf dünnen Inhalten und aggressiver Anzeigenschaltung beruhen.

Viele davon waren Affilitae-Websites, aber nicht alle.

Die meisten nutzten Content als primären Traffic-Treiber. Die Qualität der Inhalte auf den betroffenen Websites war jedoch meist sehr gering, und die Werbung war sehr stark ausgeprägt.

Die Auswirkungen der Fred Updates waren für manche Websites aber größer als nach dem Roll-Out des Panda Updates. So verloren einige Seiten im Ranking teilweise bis zu 100 Positionen. Für Webmaster und SEOs wird dadurch noch deutlicher, dass hochwertige Inhalte sowie die Einhaltung der Google Richtlinien für Webmaster unbedingt erforderlich sind, um nicht abgestraft zu werden.

Weil Google die einzelnen Algorithmusänderungen nicht konkretisiert und nur allgemein auf die Qualität verweist, mussten sich Webseitenbetreiber nach dem Fred Update umso mehr fragen, ob ihre Seiten nutzerfreundlich sind und dem Nutzerbedürfnis entsprechen. Demnach könnte eine Konsequenz aus den Fred Updates sein, dass das Motto „Was gut für Nutzer ist, ist gut für Google“ heute zum uneingeschränkten Credo jeder Suchmaschinenoptimierung werden sollte.

Kampf gegen KI Content: Helpful Content Update

Mit dem Helpful Content Update verfolgt Google konsequent den Pfad, den es bereits mit BERT und dem Page Experience Update betreten hat: Die Suchabsicht und Zufriedenheit des Nutzers sind für den Suchmaschinen-Titanen entscheidend.

Dieses Update, das zwischen dem 25. August und dem 9. September 2022 in den USA und im Dezember 2022 weltweit eingeführt wurde, hat ein neues Signal für die gesamte Website hinzugefügt, das von Google neben vielen anderen Rankingfaktoren berücksichtigt wird. Nach dieser Aktualisierung kann der Google-Algorithmus automatisch Inhalte identifizieren, die den Suchenden wenig oder keinen zusätzlichen Nutzen bieten oder aus verschiedenen Gründen als nicht hilfreich angesehen werden.

Google rät allen Content-Erstellern, einen menschenzentrierten Ansatz zu verfolgen, anstatt Inhalte speziell für Suchmaschinen zu erstellen. Originale Inhalte, die “von Nutzern für Nutzer” erstellt werden, stehen im Vordergrund. Damit setzt Google mit diesem Update auch ein Statement gegen automatisch generierte Inhalte (z. B. durch KI).

KI Revolution in der Suche: AI Overviews

Seit 2024 integriert Google sogenannte AI Overviews in die Suchergebnisse. Diese nutzen generative KI, um aus verschiedenen Quellen prägnante Zusammenfassungen direkt am Anfang der Suchseite anzuzeigen – noch vor den klassischen organischen Treffern.

Ziel ist es, Nutzern schnelle, kontextreiche Antworten zu bieten, ohne dass sie einzelne Webseiten aufrufen müssen. Diese Innovation verändert das Suchverhalten erheblich: Viele Nutzer bleiben bei den KI-generierten Antworten, was besonders bei Publishern und Nachrichten-Websites zu deutlichen Einbußen im organischen Traffic führt. Für Website-Betreiber bedeutet dies, dass sie ihre Inhalte stärker auf Mehrwert, Einzigartigkeit und Sichtbarkeit innerhalb dieser neuen Struktur ausrichten müssen.

Wie du am besten auf Google Updates reagierst

Panik ist selten ein guter Ratgeber. Wenn deine Website von einem Google Update betroffen ist, ist es wichtig, besonnen zu reagieren:

  1. Bleib ruhig und beobachte: Nicht jede Ranking-Änderung ist direkt auf ein Update zurückzuführen. Manchmal sind es temporäre Schwankungen oder Wettbewerber-Aktivitäten. Warte einige Tage bis Wochen ab, um zu sehen, ob sich die Rankings stabilisieren.

  2. Überprüfe deine Daten: Analysiere in Google Analytics und der Google Search Console die betroffenen Seiten, Keywords und den Traffic-Verlauf. Gibt es spezifische Muster?

  3. Verstehe die Update-Ziele: Informiere dich, welche Ziele das jeweilige Update verfolgt. Google gibt oft Hinweise darauf, worauf sie Wert legen.

  4. Fokus auf Qualität und Nutzererfahrung: Unabhängig vom konkreten Update-Inhalt: Google belohnt immer Websites, die hochwertige, relevante Inhalte bieten und eine exzellente Nutzererfahrung ermöglichen. Überprüfe deine Website kritisch in Bezug auf:

    • Inhaltsqualität: Sind deine Inhalte umfassend, präzise, einzigartig und nützlich?
    • Nutzerfreundlichkeit (UX): Ist deine Website schnell, mobilfreundlich, leicht navigierbar und ohne störende Elemente?
    • E-A-T: Wenn deine Website in einem YMYL-Bereich tätig ist, stelle sicher, dass deine Expertise, Autorität und Vertrauenswürdigkeit klar erkennbar sind.
    • Technische SEO: Gibt es technische Probleme, die das Crawling oder die Indexierung behindern?
    • Backlink-Profil: Ist dein Backlink-Profil natürlich und hochwertig?
  5. Vermeide schnelle, drastische Änderungen: Experimentiere nicht wild mit deiner Website, ohne die Ursache des Problems zu kennen. Analysiere, teste und implementiere Änderungen schrittweise.

PCEtLSBFeHRlcm5lIFJlc3NvdXJjZW4gKFNjaHJpZnRlbiAmIFN0aWxlKSAtLT4KPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbj4KPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs3MDA7OTAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2NoYXJ0LmpzIj48L3NjcmlwdD4KCjwhLS0gQmVudXR6ZXJkZWZpbmllcnRlIFN0aWxlIGbDvHIgZGllIEluZm9ncmFmaWsgLS0+CjxzdHlsZT4KICAgIC5nb29nbGUtaW5mb2dyYXBoaWMtYm9keSB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdJbnRlcicsIHNhbnMtc2VyaWY7CiAgICB9CiAgICAuZ29vZ2xlLWluZm9ncmFwaGljLWJvZHkgLmNoYXJ0LWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogNjAwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgICAgIGhlaWdodDogMzUwcHg7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICB9CiAgICBAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsKICAgICAgICAuZ29vZ2xlLWluZm9ncmFwaGljLWJvZHkgLmNoYXJ0LWNvbnRhaW5lciB7CiAgICAgICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgICAgfQogICAgfQogICAgLmdvb2dsZS1pbmZvZ3JhcGhpYy1ib2R5IC5mbG93LWFycm93OjphZnRlciB7CiAgICAgICAgY29udGVudDogJ+KWvCc7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAycmVtOwogICAgICAgIGNvbG9yOiAjNTg1MDhEOwogICAgICAgIG1hcmdpbjogMC41cmVtIDA7CiAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUtaW5mb2dyYXBoaWMtYm91bmNlIDEuNXMgaW5maW5pdGU7CiAgICB9CiAgICBAa2V5ZnJhbWVzIGdvb2dsZS1pbmZvZ3JhcGhpYy1ib3VuY2UgewogICAgICAgIDAlLCAyMCUsIDUwJSwgODAlLCAxMDAlIHsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIH0KICAgICAgICA0MCUgewogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpOwogICAgICAgIH0KICAgICAgICA2MCUgewogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICAgICAgfQogICAgfQogICAgLmdvb2dsZS1pbmZvZ3JhcGhpYy1ib2R5IC50aW1lbGluZS1pdGVtOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtMzEuNXB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNCQzUwOTA7CiAgICAgICAgYm9yZGVyOiAzcHggc29saWQgI2YwZjJmNTsgLyogUGFzc2VuIFNpZSBkaWVzIGdnZi4gYW4gSWhyZSBTZWl0ZW5oaW50ZXJncnVuZGZhcmJlIGFuICovCiAgICAgICAgei1pbmRleDogMTsKICAgIH0KICAgIC5nb29nbGUtaW5mb2dyYXBoaWMtYm9keSAudGltZWxpbmUtbGluZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IC0yMi41cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogNHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkMWQ1ZGI7CiAgICB9Cjwvc3R5bGU+Cgo8IS0tIEhhdXB0aW5oYWx0IGRlciBJbmZvZ3JhZmlrIC0tPgo8ZGl2IGNsYXNzPSJnb29nbGUtaW5mb2dyYXBoaWMtYm9keSB0ZXh0LWdyYXktODAwIj4KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBteC1hdXRvIHAtNCBtZDpwLTggbWF4LXctN3hsIj4KCiAgICAgICAgPGhlYWRlciBjbGFzcz0idGV4dC1jZW50ZXIgbWItMTIgbWQ6bWItMTYiPgogICAgICAgICAgICA8aDEgY2xhc3M9InRleHQtNHhsIG1kOnRleHQtNnhsIGZvbnQtYmxhY2sgdGV4dC1bIzAwM0Y1Q10gdHJhY2tpbmctdGlnaHQiPkRpZSBBbmF0b21pZSBkZXIgR29vZ2xlIFVwZGF0ZXM8L2gxPgogICAgICAgICAgICA8cCBjbGFzcz0ibXQtNCB0ZXh0LWxnIG1kOnRleHQteGwgdGV4dC1ncmF5LTYwMCBtYXgtdy0zeGwgbXgtYXV0byI+RWluIHZpc3VlbGxlciBMZWl0ZmFkZW4genVtIFZlcnN0ZWhlbiwgUmVhZ2llcmVuIHVuZCBWb3JiZXJlaXRlbiBhdWYgZGllIHN0w6RuZGlnZW4gVmVyw6RuZGVydW5nZW4gZGVzIEdvb2dsZS1BbGdvcml0aG11cy48L3A+CiAgICAgICAgPC9oZWFkZXI+CgogICAgICAgIDxtYWluPgogICAgICAgICAgICA8c2VjdGlvbiBpZD0iaW50cm8iIGNsYXNzPSJtYi0xMiBtZDptYi0yMCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGdhcC04IGl0ZW1zLWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtOCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0idGV4dC0yeGwgZm9udC1ib2xkIHRleHQtWyMwMDNGNUNdIG1iLTMiPldhcyBzaW5kIEdvb2dsZSBVcGRhdGVzPzwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LWdyYXktNjAwIGxlYWRpbmctcmVsYXhlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGUgcGFzc3Qgc2VpbmVuIFN1Y2hhbGdvcml0aG11cyBrb250aW51aWVybGljaCBhbiwgdW0gZGllIFF1YWxpdMOkdCBkZXIgU3VjaGVyZ2Vibmlzc2UgenUgdmVyYmVzc2Vybi4gV8OkaHJlbmQgdMOkZ2xpY2gga2xlaW5lLCBrYXVtIG1lcmtsaWNoZSDDhG5kZXJ1bmdlbiBzdGF0dGZpbmRlbiwgcm9sbHQgR29vZ2xlIG1laHJtYWxzIGltIEphaHIgZ3Jvw59lICoqQ29yZSBVcGRhdGVzKiogYXVzLiBEYXMgWmllbCBpc3QgaW1tZXIgZGFzc2VsYmU6IE51dHplcm4gZGllIHJlbGV2YW50ZXN0ZW4gdW5kIHZlcnRyYXVlbnN3w7xyZGlnc3RlbiBBbnR3b3J0ZW4genUgbGllZmVybiB1bmQgZ2xlaWNoemVpdGlnIFNwYW0gdW5kIG1pbmRlcndlcnRpZ2UgSW5oYWx0ZSB6dSBiZWvDpG1wZmVuLgogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCB0ZXh0LWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LTR4bCBtZDp0ZXh0LTV4bCBmb250LWV4dHJhYm9sZCB0ZXh0LVsjQkM1MDkwXSI+My00PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJtdC0yIHRleHQtZ3JheS02MDAiPkNvcmUgVXBkYXRlcyBwcm8gSmFocjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtNHhsIG1kOnRleHQtNXhsIGZvbnQtZXh0cmFib2xkIHRleHQtWyNGRjYzNjFdIj4+OTAlPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJtdC0yIHRleHQtZ3JheS02MDAiPkZva3VzIGF1ZiBOdXR6ZXJ6dWZyaWVkZW5oZWl0PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIAogICAgICAgICAgICA8c2VjdGlvbiBpZD0idGltZWxpbmUiIGNsYXNzPSJtYi0xMiBtZDptYi0yMCI+CiAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJ0ZXh0LTN4bCBmb250LWJvbGQgdGV4dC1jZW50ZXIgdGV4dC1bIzAwM0Y1Q10gbWItMTAiPkRpZSBFdm9sdXRpb24gZGVyIEFsZ29yaXRobXVzLVVwZGF0ZXM8L2gyPgogICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlbGF0aXZlIG1heC13LTJ4bCBteC1hdXRvIHBsLTEwIj4KICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZWxpbmUtbGluZSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYWNlLXktMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZWxhdGl2ZSB0aW1lbGluZS1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0idGV4dC14bCBmb250LWJvbGQgdGV4dC1bIzU4NTA4RF0iPlBhbmRhIDxzcGFuIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtbm9ybWFsIHRleHQtZ3JheS01MDAgbWwtMiI+MjAxMTwvc3Bhbj48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtZ3JheS02MDAgbXQtMSI+S8OkbXBmdGUgZ2VnZW4gZMO8bm5lIEluaGFsdGUgdW5kIENvbnRlbnQtRmFybWVuLiBRdWFsaXTDpHQgd3VyZGUgenVtIE1hw59zdGFiLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlbGF0aXZlIHRpbWVsaW5lLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LVsjNTg1MDhEXSI+UGVuZ3VpbiA8c3BhbiBjbGFzcz0idGV4dC1sZyBmb250LW5vcm1hbCB0ZXh0LWdyYXktNTAwIG1sLTIiPjIwMTI8L3NwYW4+PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LWdyYXktNjAwIG10LTEiPlN0cmFmdGUgdW5uYXTDvHJsaWNoZW4gTGlua2F1ZmJhdSB1bmQgU3BhbS1CYWNrbGlua3MgYWIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlbGF0aXZlIHRpbWVsaW5lLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LVsjNTg1MDhEXSI+SHVtbWluZ2JpcmQgPHNwYW4gY2xhc3M9InRleHQtbGcgZm9udC1ub3JtYWwgdGV4dC1ncmF5LTUwMCBtbC0yIj4yMDEzPC9zcGFuPjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTYwMCBtdC0xIj5WZXJsYWdlcnRlIGRlbiBGb2t1cyB2b24gS2V5d29yZHMgYXVmIGRpZSBzZW1hbnRpc2NoZSBCZWRldXR1bmcgdW5kIE51dHplcmFic2ljaHQuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVsYXRpdmUgdGltZWxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InRleHQteGwgZm9udC1ib2xkIHRleHQtWyM1ODUwOERdIj5CRVJUIDxzcGFuIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtbm9ybWFsIHRleHQtZ3JheS01MDAgbWwtMiI+MjAxOTwvc3Bhbj48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtZ3JheS02MDAgbXQtMSI+VmVyYmVzc2VydGUgZGFzIFZlcnN0w6RuZG5pcyBmw7xyIGRlbiBLb250ZXh0IHZvbiBXw7ZydGVybiB1bmQgZGllIG5hdMO8cmxpY2hlIFNwcmFjaGUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVsYXRpdmUgdGltZWxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InRleHQteGwgZm9udC1ib2xkIHRleHQtWyM1ODUwOERdIj5IZWxwZnVsIENvbnRlbnQgVXBkYXRlIDxzcGFuIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtbm9ybWFsIHRleHQtZ3JheS01MDAgbWwtMiI+MjAyMjwvc3Bhbj48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtZ3JheS02MDAgbXQtMSI+QmVsb2hudCBJbmhhbHRlLCBkaWUgZsO8ciBNZW5zY2hlbiBnZXNjaHJpZWJlbiBzaW5kLCBuaWNodCBmw7xyIFN1Y2htYXNjaGluZW4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KCiAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJ1cGRhdGUtdHlwZXMiIGNsYXNzPSJtYi0xMiBtZDptYi0yMCI+CiAgICAgICAgICAgICAgICA8aDIgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWNlbnRlciB0ZXh0LVsjMDAzRjVDXSBtYi00Ij5IZXV0aWdlIFVwZGF0ZS1UeXBlbiBpbSBWZXJnbGVpY2g8L2gyPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtY2VudGVyIHRleHQtZ3JheS02MDAgbWF4LXctMnhsIG14LWF1dG8gbWItMTAiPkdvb2dsZS1VcGRhdGVzIGhhYmVuIHVudGVyc2NoaWVkbGljaGUgU2Nod2VycHVua3RlLiBEaWVzZSBHcmFmaWsgdmVyZ2xlaWNodCBkaWUgcmVsYXRpdmUgQXVzd2lya3VuZyBkZXIgd2ljaHRpZ3N0ZW4gVXBkYXRlLVR5cGVuIGF1ZiBkaWUgU3VjaHJhbmtpbmdzLjwvcD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTQgbWQ6cC04Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGFydC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJ1cGRhdGVUeXBlc0NoYXJ0Ij48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIAogICAgICAgICAgICA8c2VjdGlvbiBpZD0iZWVhdCIgY2xhc3M9Im1iLTEyIG1kOm1iLTIwIj4KICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIHRleHQtY2VudGVyIHRleHQtWyMwMDNGNUNdIG1iLTQiPkdvb2dsZXMgUXVhbGl0w6R0c2Zvcm1lbDogRS1FLUEtVDwvaDI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1jZW50ZXIgdGV4dC1ncmF5LTYwMCBtYXgtdy0yeGwgbXgtYXV0byBtYi0xMCI+RS1FLUEtVCAoRXhwZXJpZW5jZSwgRXhwZXJ0aXNlLCBBdXRob3JpdGF0aXZlbmVzcywgVHJ1c3R3b3J0aGluZXNzKSBpc3Qga2VpbiBkaXJla3RlciBSYW5raW5nZmFrdG9yLCBhYmVyIGVpbiBlbnRzY2hlaWRlbmRlcyBLb256ZXB0LCBkYXMgZGllIFF1YWxpdMOkdCB2b24gSW5oYWx0ZW4gYmV3ZXJ0ZXQuPC9wPgogICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTQgZ2FwLTYiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTYgdGV4dC1jZW50ZXIgdHJhbnNmb3JtIGhvdmVyOnNjYWxlLTEwNSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0zMDAiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LTR4bCBtYi0zIj7wn6eQPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0idGV4dC1sZyBmb250LWJvbGQgdGV4dC1bIzAwM0Y1Q10iPkV4cGVyaWVuY2U8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1zbSB0ZXh0LWdyYXktNjAwIG10LTEiPlByYWt0aXNjaGUgRXJmYWhydW5nIGRlcyBBdXRvcnMgbWl0IGRlbSBUaGVtYS48L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtNiB0ZXh0LWNlbnRlciB0cmFuc2Zvcm0gaG92ZXI6c2NhbGUtMTA1IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTMwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQtNHhsIG1iLTMiPvCfjpM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LVsjNTg1MDhEXSI+RXhwZXJ0aXNlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTYwMCBtdC0xIj5GYWNod2lzc2VuIHVuZCBLb21wZXRlbnogaW0gYmVoYW5kZWx0ZW4gQmVyZWljaC48L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtNiB0ZXh0LWNlbnRlciB0cmFuc2Zvcm0gaG92ZXI6c2NhbGUtMTA1IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTMwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQtNHhsIG1iLTMiPvCfkZE8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LVsjQkM1MDkwXSI+QXV0aG9yaXRhdGl2ZW5lc3M8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1zbSB0ZXh0LWdyYXktNjAwIG10LTEiPkRpZSBBbmVya2VubnVuZyBhbHMgQXV0b3JpdMOkdCBpbiBkZXIgQnJhbmNoZS48L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtNiB0ZXh0LWNlbnRlciB0cmFuc2Zvcm0gaG92ZXI6c2NhbGUtMTA1IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTMwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQtNHhsIG1iLTMiPvCfm6HvuI88L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LVsjRkY2MzYxXSI+VHJ1c3R3b3J0aGluZXNzPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTYwMCBtdC0xIj5EaWUgYWxsZ2VtZWluZSBWZXJ0cmF1ZW5zd8O8cmRpZ2tlaXQgZGVyIFNlaXRlIHVuZCBkZXMgQXV0b3JzLjwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgICAgICA8c2VjdGlvbiBpZD0icmVhY3Rpb24tZmxvdyIgY2xhc3M9Im1iLTEyIG1kOm1iLTIwIj4KICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIHRleHQtY2VudGVyIHRleHQtWyMwMDNGNUNdIG1iLTQiPlJhbmtpbmctRWluYnJ1Y2g/IElociBOb3RmYWxscGxhbjwvaDI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1jZW50ZXIgdGV4dC1ncmF5LTYwMCBtYXgtdy0yeGwgbXgtYXV0byBtYi0xMCI+RWluIHBsw7Z0emxpY2hlciBUcmFmZmljLVZlcmx1c3Qga2FubiBiZXVucnVoaWdlbmQgc2Vpbi4gRGllc2VyIFBsYW4gemVpZ3QgSWhuZW4sIHdpZSBTaWUgc3lzdGVtYXRpc2NoIHVuZCBvaG5lIFBhbmlrIHJlYWdpZXJlbi48L3A+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBzcGFjZS15LTQgdGV4dC1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTYgdy1mdWxsIG1heC13LW1kIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LVsjMDAzRjVDXSI+MS4gUnVoZSBiZXdhaHJlbiAmIGJlb2JhY2h0ZW48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTYwMCBtdC0xIj5IYW5kZWxuIFNpZSBuaWNodCDDvGJlcnN0w7xyenQuIFdhcnRlbiBTaWUsIGJpcyBkYXMgVXBkYXRlIG9mZml6aWVsbCBhYmdlc2NobG9zc2VuIGlzdC48L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxvdy1hcnJvdyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtNiB3LWZ1bGwgbWF4LXctbWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InRleHQteGwgZm9udC1ib2xkIHRleHQtWyM1ODUwOERdIj4yLiBVcGRhdGUgJiBEYXRlbiBhbmFseXNpZXJlbjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LWdyYXktNjAwIG10LTEiPlZlcnN0ZWhlbiBTaWUgZGFzIFppZWwgZGVzIFVwZGF0ZXMuIFdlbGNoZSBTZWl0ZW4gdW5kIEtleXdvcmRzIHNpbmQgYmV0cm9mZmVuPyBOdXR6ZW4gU2llIGRpZSBTZWFyY2ggQ29uc29sZS48L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsb3ctYXJyb3ciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy1sZyBwLTYgdy1mdWxsIG1heC13LW1kIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LVsjQkM1MDkwXSI+My4gS29ua3VycmVueiAmIEUtRS1BLVQgcHLDvGZlbjwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ0ZXh0LWdyYXktNjAwIG10LTEiPldhcyBtYWNoZW4gZGllIEdld2lubmVyIGJlc3Nlcj8gU2VpZW4gU2llIHNlbGJzdGtyaXRpc2NoIGJlesO8Z2xpY2ggSWhyZXIgSW5oYWx0ZSB1bmQgZGVyIE51dHplcmZyZXVuZGxpY2hrZWl0LjwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxvdy1hcnJvdyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtNiB3LWZ1bGwgbWF4LXctbWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InRleHQteGwgZm9udC1ib2xkIHRleHQtWyNGRjYzNjFdIj40LiBNYcOfbmFobWVuIGFibGVpdGVuICYgdW1zZXR6ZW48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTYwMCBtdC0xIj5FcnN0ZWxsZW4gU2llIGVpbmVuIFBsYW46IEluaGFsdGUgw7xiZXJhcmJlaXRlbiwgVGVjaG5payB2ZXJiZXNzZXJuIG9kZXIgZGllIFVzZXIgRXhwZXJpZW5jZSBvcHRpbWllcmVuLjwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIAogICAgICAgICAgICA8c2VjdGlvbiBpZD0icHJvYWN0aXZlLWNoZWNrbGlzdCIgY2xhc3M9Im1iLTEyIG1kOm1iLTIwIj4KICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWNlbnRlciB0ZXh0LVsjMDAzRjVDXSBtYi0xMCI+SWhyZSBDaGVja2xpc3RlIGbDvHIgZWluZSB6dWt1bmZ0c3NpY2hlcmUgV2Vic2l0ZTwvaDI+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF4LXctMnhsIG14LWF1dG8gYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LWxnIHAtOCI+CiAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ic3BhY2UteS00Ij4KICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZmxleCBpdGVtcy1zdGFydCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtZ3JlZW4tNTAwIHRleHQtMnhsIG1yLTMiPuKclDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImZvbnQtYm9sZCI+SGVyYXVzcmFnZW5kZSwgbnV0emVyemVudHJpZXJ0ZSBJbmhhbHRlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtZ3JheS02MDAgdGV4dC1zbSI+TMO2c2VuIFNpZSBkaWUgUHJvYmxlbWUgSWhyZXIgWmllbGdydXBwZSB1bWZhc3NlbmQgdW5kIHZlcnN0w6RuZGxpY2guPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZmxleCBpdGVtcy1zdGFydCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtZ3JlZW4tNTAwIHRleHQtMnhsIG1yLTMiPuKclDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImZvbnQtYm9sZCI+RS1FLUEtVCBkZW1vbnN0cmllcmVuPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InRleHQtZ3JheS02MDAgdGV4dC1zbSI+WmVpZ2VuIFNpZSBFeHBlcnRpc2UgZHVyY2ggQXV0b3JlbnByb2ZpbGUsIFF1ZWxsZW4gdW5kIGVocmxpY2hlIEJld2VydHVuZ2VuLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImZsZXggaXRlbXMtc3RhcnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LWdyZWVuLTUwMCB0ZXh0LTJ4bCBtci0zIj7inJQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmb250LWJvbGQiPkV4emVsbGVudGUgVXNlciBFeHBlcmllbmNlIChVWCk8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj5Tb3JnZW4gU2llIGbDvHIgZWluZSBzY2huZWxsZSwgbW9iaWxmcmV1bmRsaWNoZSB1bmQgaW50dWl0aXZlIFdlYnNpdGUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZmxleCBpdGVtcy1zdGFydCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtZ3JlZW4tNTAwIHRleHQtMnhsIG1yLTMiPuKclDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImZvbnQtYm9sZCI+TmF0w7xybGljaGVzIExpbmtwcm9maWw8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj5WZXJkaWVuZW4gU2llIHNpY2ggTGlua3MgZHVyY2ggUXVhbGl0w6R0LCBhbnN0YXR0IHNpZSB6dSBtYW5pcHVsaWVyZW4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8L21haW4+CgogICAgICAgIDxmb290ZXIgY2xhc3M9InRleHQtY2VudGVyIG10LTEyIGJvcmRlci10IHB0LTgiPgogICAgICAgICAgICA8cCBjbGFzcz0idGV4dC1ncmF5LTUwMCI+RXJzdGVsbHQgbWl0IEZva3VzIGF1ZiBEYXRlbnZpc3VhbGlzaWVydW5nIHVuZCBOdXR6ZXJlcmxlYm5pcy4gQmxlaWJlbiBTaWUgaW5mb3JtaWVydCwgYmxlaWJlbiBTaWUgcmVsZXZhbnQuPC9wPgogICAgICAgIDwvZm9vdGVyPgoKICAgIDwvZGl2Pgo8L2Rpdj4KCjwhLS0gU2tyaXB0IHp1ciBJbml0aWFsaXNpZXJ1bmcgZGVzIERpYWdyYW1tcyAtLT4KPHNjcmlwdD4KICAgIGZ1bmN0aW9uIHJlbmRlckdvb2dsZVVwZGF0ZUNoYXJ0KCkgewogICAgICAgIGNvbnN0IGNoYXJ0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVUeXBlc0NoYXJ0Jyk7CiAgICAgICAgaWYgKCFjaGFydEVsZW1lbnQpIHJldHVybjsKCiAgICAgICAgLy8gVmVyaGluZGVybiwgZGFzcyBkYXMgRGlhZ3JhbW0gbWVocmZhY2ggZ2VyZW5kZXJ0IHdpcmQKICAgICAgICBpZiAoY2hhcnRFbGVtZW50LmNoYXJ0KSB7CiAgICAgICAgICAgIGNoYXJ0RWxlbWVudC5jaGFydC5kZXN0cm95KCk7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBjdHggPSBjaGFydEVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjb25zdCB1cGRhdGVUeXBlc0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCwgewogICAgICAgICAgICB0eXBlOiAnYmFyJywKICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgbGFiZWxzOiBbJ0NvcmUgVXBkYXRlcycsICdIZWxwZnVsIENvbnRlbnQgU3lzdGVtJywgJ1NwYW0gVXBkYXRlcycsICdSZXZpZXdzIFVwZGF0ZXMnXSwKICAgICAgICAgICAgICAgIGRhdGFzZXRzOiBbewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVsYXRpdmVyIEltcGFjdCBhdWYgUmFua2luZ3MnLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IFs5LCA4LCA3LCA2XSwKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJyMwMDNGNUMnLAogICAgICAgICAgICAgICAgICAgICAgICAnIzU4NTA4RCcsCiAgICAgICAgICAgICAgICAgICAgICAgICcjQkM1MDkwJywKICAgICAgICAgICAgICAgICAgICAgICAgJyNGRjYzNjEnCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogWwogICAgICAgICAgICAgICAgICAgICAgICAnIzAwM0Y1QycsCiAgICAgICAgICAgICAgICAgICAgICAgICcjNTg1MDhEJywKICAgICAgICAgICAgICAgICAgICAgICAgJyNCQzUwOTAnLAogICAgICAgICAgICAgICAgICAgICAgICAnI0ZGNjM2MScKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAxCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9LAogICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICBpbmRleEF4aXM6ICd5JywKICAgICAgICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsCiAgICAgICAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNjYWxlczogewogICAgICAgICAgICAgICAgICAgIHg6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0ltcGFjdC1Ta2FsYSAoMS0xMCknCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcGx1Z2luczogewogICAgICAgICAgICAgICAgICAgIGxlZ2VuZDogewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmdW5jdGlvbih0b29sdGlwSXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdG9vbHRpcEl0ZW1zWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGl0ZW0uY2hhcnQuZGF0YS5sYWJlbHNbaXRlbS5kYXRhSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLmpvaW4oJyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGNoYXJ0RWxlbWVudC5jaGFydCA9IHVwZGF0ZVR5cGVzQ2hhcnQ7CiAgICB9CgogICAgLy8gU3RlbGxlbiBTaWUgc2ljaGVyLCBkYXNzIGRhcyBET00gdm9sbHN0w6RuZGlnIGdlbGFkZW4gaXN0LCBiZXZvciBkYXMgRGlhZ3JhbW0gZ2VyZW5kZXJ0IHdpcmQuCiAgICAvLyBJbiBXb3JkUHJlc3MgaXN0IGVzIG1hbmNobWFsIHNpY2hlcmVyLCBhdWYgZGllc2UgV2Vpc2UgYXVmIGRhcyBMYWRlbiB6dSB3YXJ0ZW4uCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHJlbmRlckdvb2dsZVVwZGF0ZUNoYXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyR29vZ2xlVXBkYXRlQ2hhcnQoKTsKICAgIH0KPC9zY3JpcHQ+