hy-virtual-tree 1.1.43 → 1.1.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -73,6 +73,12 @@ var menu_acquisitionStation_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0
73
73
 
74
74
  var noData = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjhweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgNjggODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICAgICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsLW9wYWNpdHk9IjAuNiI+CiAgICAgICAgPGcgaWQ9Iuagt+W8jy0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTQzOS4wMDAwMDAsIC0zNjAuMDAwMDAwKSIgZmlsbD0iIzVFOURCNCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9Im5vRGF0YSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQzOS4wMDAwMDAsIDM2MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00OCw1MiBDNDMuMDI5MjQ2Myw1MiAzOSw1NS44MDUzOTkzIDM5LDYwLjUgQzM5LDY1LjE5NDYwMDcgNDMuMDI5MjQ2Myw2OSA0OCw2OSBDNTIuOTcwNzUzNyw2OSA1Nyw2NS4xOTQ2MDA3IDU3LDYwLjUgQzU2Ljk4OTg3NjMsNTUuODA1Mzk5MyA1Mi45NjA2Mjk5LDUyIDQ4LDUyIFogTTYyLjEyMDUyNCwwIEw1Ljg1OTY3OTgsMCBDMi42MjI5OTg1NCwwIDAsMi41NjU3MTAxNSAwLDUuNzEwMTUxOTIgTDAsNzQuMjg5ODQ4MSBDMCw3Ny40NDM5MzU0IDIuNjMyODk2NjUsODAgNS44NTk2Nzk4LDgwIEw2Mi4xMjA1MjQsODAgQzYyLjY1NTAyMTgsODAgNjMuMTY5NzIzNCw3OS45MzI0ODEzIDYzLjY2NDYyODgsNzkuODA3MDg5NSBMNTYuMDcyNzgwMiw3Mi40MDg5NzAzIEM1My43NTY2MjMsNzMuOTEzNjcyNSA1MC45NzUyNTQ3LDc0Ljc3MjEyNDQgNDcuOTk1OTI0Myw3NC43NzIxMjQ0IEMzOS44OTkyNzIyLDc0Ljc3MjEyNDQgMzMuMzM2ODI2OCw2OC4zNzcxNDAxIDMzLjMzNjgyNjgsNjAuNDg3MDk5MSBDMzMuMzM2ODI2OCw1Mi41OTcwNTgxIDM5Ljg5OTI3MjIsNDYuMjAyMDczOCA0Ny45OTU5MjQzLDQ2LjIwMjA3MzggQzU2LjA5MjU3NjQsNDYuMjAyMDczOCA2Mi42NTUwMjE4LDUyLjU5NzA1ODEgNjIuNjU1MDIxOCw2MC40ODcwOTkxIEM2Mi42NTUwMjE4LDYzLjQwMDA0ODIgNjEuNzU0Mjk0LDY2LjEwMDc5NTggNjAuMjI5OTg1NCw2OC4zNTc4NDkgTDY3LjgxMTkzNiw3NS43NDYzMjI2IEM2Ny45NDA2MTE0LDc1LjI4MzMzNzQgNjgsNzQuNzkxNDE1NSA2OCw3NC4yODAyMDI2IEw2OCw1LjcwMDUwNjM5IEM2Ny45OTAxMDE5LDIuNTU2MDY0NjMgNjUuMzU3MjA1MiwwIDYyLjEyMDUyNCwwIFogTTMwLjEwOTExMTQsNDguMTIxMjEyMSBDMjkuNTYyNDI5Nyw0OC42NjY2NjY3IDI4LjgxMzI3MzMsNDkgMjcuOTkzMjUwOCw0OSBMMTUuOTk2NjI1NCw0OC45Nzk3OTggQzE0LjM0NjQ1NjcsNDguOTc5Nzk4IDEzLDQ3LjYzNjM2MzYgMTMsNDUuOTg5ODk5IEMxMyw0NS4xNzE3MTcyIDEzLjMzNDA4MzIsNDQuNDE0MTQxNCAxMy44ODA3NjQ5LDQzLjg3ODc4NzkgQzE0LjQyNzQ0NjYsNDMuMzMzMzMzMyAxNS4xNzY2MDI5LDQzIDE1Ljk5NjYyNTQsNDMgTDI4LjAwMzM3NDYsNDMuMDIwMjAyIEMyOS42NTM1NDMzLDQzLjAyMDIwMiAzMSw0NC4zNjM2MzY0IDMxLDQ2LjAxMDEwMSBDMzAuOTg5ODc2Myw0Ni44MjgyODI4IDMwLjY0NTY2OTMsNDcuNTc1NzU3NiAzMC4xMDkxMTE0LDQ4LjEyMTIxMjEgTDMwLjEwOTExMTQsNDguMTIxMjEyMSBaIE01My4xMzk4NjAxLDMyLjExODI0MzIgQzUyLjYwNTk4MDIsMzIuNjY1NTQwNSA1MS44NzQzNjcsMzMgNTEuMDczNTQ3MSwzMyBMMTUuOTI2NDUyOSwzMyBDMTQuMzE0OTI2NSwzMyAxMywzMS42NTIwMjcgMTMsMzAgQzEzLDI5LjE3OTA1NDEgMTMuMzI2MjU5OSwyOC40MjkwNTQxIDEzLjg2MDEzOTksMjcuODgxNzU2OCBDMTQuMzk0MDE5OCwyNy4zMzQ0NTk1IDE1LjEyNTYzMywyNyAxNS45MjY0NTI5LDI3IEw1MS4wNzM1NDcxLDI3IEM1Mi42ODUwNzM1LDI3IDU0LDI4LjM0Nzk3MyA1NCwzMCBDNTQsMzAuODIwOTQ1OSA1My42NjM4NTM0LDMxLjU3MDk0NTkgNTMuMTM5ODYwMSwzMi4xMTgyNDMyIEw1My4xMzk4NjAxLDMyLjExODI0MzIgWiBNNTMuMTM5ODYwMSwxNi4xMTgyNDMyIEM1Mi42MDU5ODAyLDE2LjY2NTU0MDUgNTEuODc0MzY3LDE3IDUxLjA3MzU0NzEsMTcgTDE1LjkyNjQ1MjksMTcgQzE0LjMxNDkyNjUsMTcgMTMsMTUuNjUyMDI3IDEzLDE0IEMxMywxMy4xNzkwNTQxIDEzLjMyNjI1OTksMTIuNDE4OTE4OSAxMy44NjAxMzk5LDExLjg4MTc1NjggQzE0LjM5NDAxOTgsMTEuMzM0NDU5NSAxNS4xMjU2MzMsMTEgMTUuOTI2NDUyOSwxMSBMNTEuMDczNTQ3MSwxMSBDNTIuNjg1MDczNSwxMSA1NCwxMi4zNDc5NzMgNTQsMTQgQzU0LDE0LjgyMDk0NTkgNTMuNjYzODUzNCwxNS41NzA5NDU5IDUzLjEzOTg2MDEsMTYuMTE4MjQzMiBMNTMuMTM5ODYwMSwxNi4xMTgyNDMyIFoiIGlkPSLlvaLnirYiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+';
75
75
 
76
+ var video_channel_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyQ0U4OTgiIHAtaWQ9IjE2OTYiPjwvcGF0aD48L3N2Zz4=';
77
+
78
+ var video_channel_offLine_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiM5MDkzOTkiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
79
+
80
+ var video_channel_monitor_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyREYyRkYiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
81
+
76
82
  const svgMap = {
77
83
  workCard_svg,
78
84
  workCard_offLine_svg,
@@ -105,17 +111,157 @@ const svgMap = {
105
111
  walkieTalkie_svg,
106
112
  walkieTalkie_offLine_svg,
107
113
  menu_acquisitionStation_svg,
108
- noData
114
+ noData,
115
+ video_channel_svg,
116
+ video_channel_offLine_svg,
117
+ video_channel_monitor_svg
109
118
  };
110
119
 
120
+ const setElementFocus = (config) => {
121
+ const { container, trigger, onFocus, onBlur } = config;
122
+ let btn = document.createElement('button');
123
+ const btnFocus = () => {
124
+ btn.focus();
125
+ onFocus && onFocus();
126
+ };
127
+ const btnBlur = () => {
128
+ btn.blur();
129
+ onBlur && onBlur();
130
+ };
131
+ if (trigger === 'click') {
132
+ container.addEventListener('click', btnFocus);
133
+ btn.addEventListener('blur', btnBlur);
134
+ }
135
+ else {
136
+ container.addEventListener('mouseenter', btnFocus);
137
+ container.addEventListener('mouseleave', btnBlur);
138
+ }
139
+ return {
140
+ focus: btnFocus,
141
+ blur: btnBlur,
142
+ destroy() {
143
+ // @ts-ignore
144
+ btn = null;
145
+ if (!container)
146
+ return;
147
+ if (trigger === 'click') {
148
+ container.removeEventListener('click', btnFocus);
149
+ }
150
+ else {
151
+ container.removeEventListener('mouseenter', btnFocus);
152
+ container.removeEventListener('mouseleave', btnBlur);
153
+ }
154
+ }
155
+ };
156
+ };
157
+
158
+ let container;
159
+ const getContainer$1 = () => {
160
+ if (container)
161
+ return container;
162
+ container = document.createElement('div');
163
+ document.body.appendChild(container);
164
+ return container;
165
+ };
166
+ class Tooltip {
167
+ _el;
168
+ _config;
169
+ _focus;
170
+ _timer;
171
+ constructor(props) {
172
+ if (!props.bind || !isElement(props.bind))
173
+ throw Error('【bind参数错误】:请传入元素节点');
174
+ this._config = this._generateConfig(props);
175
+ this._render();
176
+ }
177
+ _generateConfig(config) {
178
+ return {
179
+ placement: "top",
180
+ offset: 0,
181
+ trigger: "hover",
182
+ autoClose: 0,
183
+ ...config
184
+ };
185
+ }
186
+ _render() {
187
+ const { bind, content } = this._config;
188
+ const el = document.createElement('div');
189
+ el.classList.add('hy-tooltip');
190
+ if (isElement(content)) {
191
+ el.appendChild(content);
192
+ }
193
+ else {
194
+ el.innerHTML = `${content}`;
195
+ }
196
+ const arrow = document.createElement('span');
197
+ arrow.classList.add('hy-popper__arrow');
198
+ el.appendChild(arrow);
199
+ this._el = el;
200
+ this._focus = setElementFocus({
201
+ container: bind,
202
+ trigger: this._config.trigger,
203
+ onFocus: () => {
204
+ if (!this._el)
205
+ return;
206
+ const container = getContainer$1();
207
+ container.appendChild(this._el);
208
+ this.setPopper();
209
+ if (this._config?.autoClose && isNumber(this._config?.autoClose)) {
210
+ this._timer && clearTimeout(this._timer);
211
+ this._timer = setTimeout(() => {
212
+ this._focus && this._focus.blur();
213
+ }, this._config?.autoClose);
214
+ }
215
+ },
216
+ onBlur: () => {
217
+ this._timer && clearTimeout(this._timer);
218
+ if (!this._el || !this._el.parentElement)
219
+ return;
220
+ this._el.parentElement.removeChild(this._el);
221
+ }
222
+ });
223
+ }
224
+ setPopper() {
225
+ if (!this._config || !this._el)
226
+ return;
227
+ const { offset, placement } = this._config;
228
+ const { top, left, width, height } = this._config.bind.getBoundingClientRect();
229
+ this._el.classList.add(placement);
230
+ switch (placement) {
231
+ case 'top':
232
+ this._el.style.setProperty('top', `${top - offset}px`);
233
+ this._el.style.setProperty('left', `${left + width / 2}px`);
234
+ break;
235
+ case 'bottom':
236
+ this._el.style.setProperty('top', `${top + height + offset}px`);
237
+ this._el.style.setProperty('left', `${left + width / 2}px`);
238
+ break;
239
+ case 'left':
240
+ this._el.style.setProperty('top', `${top + height / 2}px`);
241
+ this._el.style.setProperty('left', `${left - offset}px`);
242
+ break;
243
+ case 'right':
244
+ this._el.style.setProperty('top', `${top + height / 2}px`);
245
+ this._el.style.setProperty('left', `${left + width + offset}px`);
246
+ break;
247
+ }
248
+ }
249
+ destroy() {
250
+ this._timer && clearTimeout(this._timer);
251
+ this._focus && this._focus.destroy();
252
+ this._config = undefined;
253
+ }
254
+ }
255
+
111
256
  class Icon {
112
257
  _el;
113
258
  _disabled;
114
- constructor(config) {
115
- config = this._generateConfig(config);
259
+ _tooltip;
260
+ constructor(props) {
261
+ const config = this._generateConfig(props);
116
262
  this._disabled = config.disabled;
117
263
  if (!config.svgName)
118
- return;
264
+ throw Error('【svgName参数错误】:请传入图标名称');
119
265
  this._render(config);
120
266
  }
121
267
  _generateConfig(config) {
@@ -127,9 +273,17 @@ class Icon {
127
273
  };
128
274
  }
129
275
  _render(config) {
130
- const { svgName = '' } = config;
276
+ const { svgName = '', className } = config;
131
277
  const el = document.createElement('div');
132
278
  el.classList.add('hy-icon');
279
+ if (className) {
280
+ const classList = className.split(' ');
281
+ for (const name of classList) {
282
+ if (!name)
283
+ continue;
284
+ el.classList.add(name);
285
+ }
286
+ }
133
287
  const image = document.createElement('img');
134
288
  image.src = svgMap ? svgMap[svgName] : '';
135
289
  image.style.maxWidth = '100%';
@@ -154,12 +308,22 @@ class Icon {
154
308
  }
155
309
  });
156
310
  this._el = el;
311
+ if (config.tip) {
312
+ this._tooltip = new Tooltip({
313
+ bind: el,
314
+ content: config.tip
315
+ });
316
+ }
157
317
  }
158
318
  mount(container) {
159
319
  if (!this._el)
160
320
  return;
161
321
  container.appendChild(this._el);
162
322
  }
323
+ destroy() {
324
+ this._el = undefined;
325
+ this._tooltip && this._tooltip.destroy();
326
+ }
163
327
  }
164
328
 
165
329
  // @ts-nocheck
@@ -621,6 +785,43 @@ const getGlobalDeviceStatus = () => {
621
785
  return globalDeviceStatus;
622
786
  };
623
787
 
788
+ // 业务类型(config.business) device-设备 channel-通道设备 groupDevice-群组设备 group-群组 user-用户 cs-采集站
789
+ var Business;
790
+ (function (Business) {
791
+ Business["DEVICE"] = "device";
792
+ Business["CHANNEL"] = "channel";
793
+ Business["GROUP_DEVICE"] = "groupDevice";
794
+ Business["GROUP"] = "group";
795
+ Business["USER"] = "user";
796
+ Business["CS"] = "cs";
797
+ })(Business || (Business = {}));
798
+ // 设备状态(data.deviceStatus) 0-离线 1-在线 2-监控中 3-通话中 4-录像中 5-录音中 6-广播中 7-SOS
799
+ var DeviceStatus;
800
+ (function (DeviceStatus) {
801
+ DeviceStatus[DeviceStatus["OFF_LINE"] = 0] = "OFF_LINE";
802
+ DeviceStatus[DeviceStatus["ON_LINE"] = 1] = "ON_LINE";
803
+ DeviceStatus[DeviceStatus["BE_MONITOR"] = 2] = "BE_MONITOR";
804
+ DeviceStatus[DeviceStatus["IN_CALL"] = 3] = "IN_CALL";
805
+ DeviceStatus[DeviceStatus["IN_VIDEO_RECORD"] = 4] = "IN_VIDEO_RECORD";
806
+ DeviceStatus[DeviceStatus["IN_AUDIO_RECORD"] = 5] = "IN_AUDIO_RECORD";
807
+ DeviceStatus[DeviceStatus["IN_BROADCASE"] = 6] = "IN_BROADCASE";
808
+ DeviceStatus[DeviceStatus["SOS"] = 7] = "SOS"; // SOS
809
+ })(DeviceStatus || (DeviceStatus = {}));
810
+ // 业务数据类型(data.dataType) 1-部门 3-设备 4-群组 5-用户 6-考勤 7-水源点 8-采集站 9-设备通道
811
+ var DataType;
812
+ (function (DataType) {
813
+ DataType[DataType["UNKNOW_1"] = 0] = "UNKNOW_1";
814
+ DataType[DataType["DEPT"] = 1] = "DEPT";
815
+ DataType[DataType["UNKNOW_2"] = 2] = "UNKNOW_2";
816
+ DataType[DataType["DEVICE"] = 3] = "DEVICE";
817
+ DataType[DataType["GROUP"] = 4] = "GROUP";
818
+ DataType[DataType["USER"] = 5] = "USER";
819
+ DataType[DataType["ATTENDANCE"] = 6] = "ATTENDANCE";
820
+ DataType[DataType["WATER_SOURCE"] = 7] = "WATER_SOURCE";
821
+ DataType[DataType["CS"] = 8] = "CS";
822
+ DataType[DataType["CHANNEL"] = 9] = "CHANNEL"; // 设备通道
823
+ })(DataType || (DataType = {}));
824
+
624
825
  /** 生成配置项 */
625
826
  const useConfig = (config) => {
626
827
  let props = Object.assign({
@@ -647,24 +848,24 @@ const useConfig = (config) => {
647
848
  filterConfig: [],
648
849
  sortByStatus: true,
649
850
  clearEmptyBusiness: false,
650
- integratedBusiness: false,
851
+ isShowChannelSelect: true,
651
852
  ...(config.businessConfig || {})
652
853
  };
653
854
  // 设备树
654
- if (['device', 'groupDevice'].includes(`${config.business}`)) {
855
+ if (config.business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)) {
655
856
  businessConfig = {
656
857
  deviceStatusMap: getGlobalDeviceStatus(),
657
858
  filterConfig: [],
658
859
  sortByStatus: true,
659
860
  clearEmptyBusiness: false,
660
- integratedBusiness: false,
861
+ isShowChannelSelect: true,
661
862
  ...(config.businessConfig || {})
662
863
  };
663
864
  props = {
664
865
  class: '',
665
866
  disabled: 'disabled',
666
867
  showStatus: false,
667
- showCount: (data) => data.dataType !== 3,
868
+ showCount: (data) => !/^(3|9)$/.test(data.dataType),
668
869
  ...(config.props || {}),
669
870
  value: 'onlyId',
670
871
  label: 'label',
@@ -676,7 +877,7 @@ const useConfig = (config) => {
676
877
  showSelect: (data) => {
677
878
  if (rowSelection.type === 'checkbox')
678
879
  return true;
679
- return data.dataType === 3;
880
+ return /^(3|9)$/.test(data.dataType);
680
881
  },
681
882
  ...rowSelection
682
883
  };
@@ -734,6 +935,7 @@ const useConfig = (config) => {
734
935
  fontSize: 14,
735
936
  bgColor: '',
736
937
  nodeBgColor: '#1c334a',
938
+ channelBgColor: '#10263B',
737
939
  emptyText: '暂无数据',
738
940
  bufferSize: 50,
739
941
  expandOnClickNode: true,
@@ -758,13 +960,16 @@ const useHandleFun = (config) => {
758
960
  if (!node)
759
961
  return '';
760
962
  if (business && isBusiness) {
761
- switch (business) {
762
- case 'device':
763
- case 'groupDevice':
764
- return node.deviceId;
765
- case 'user':
766
- case 'cs':
963
+ switch (node.deviceType) {
964
+ case DataType.DEPT: // 部门
965
+ case DataType.GROUP: // 群组
966
+ case DataType.USER: // 用户
967
+ case DataType.CS: // 采集站
767
968
  return node.id;
969
+ case DataType.DEVICE: // 设备
970
+ return node.deviceId;
971
+ case DataType.CHANNEL: // 设备通道
972
+ return node.channelId;
768
973
  }
769
974
  }
770
975
  return node[props.value];
@@ -794,7 +999,7 @@ const useHandleFun = (config) => {
794
999
  return;
795
1000
  return node[props.total];
796
1001
  }
797
- if (['device', 'groupDevice'].includes(`${business}`)) {
1002
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
798
1003
  countFilter = (data) => {
799
1004
  return data.dataType === 3 && data.onlineState === 1;
800
1005
  };
@@ -822,6 +1027,20 @@ const useHandleFun = (config) => {
822
1027
  totalFilter,
823
1028
  // 设置设备状态
824
1029
  setDeviceStatus: (data) => {
1030
+ // 通道状态
1031
+ if (data.deviceType === 9) {
1032
+ if (data.onlineState === 1) {
1033
+ // 监控中
1034
+ if (data.beMonitor === 1) {
1035
+ return 2;
1036
+ }
1037
+ // 在线
1038
+ return 1;
1039
+ }
1040
+ // 离线
1041
+ return 0;
1042
+ }
1043
+ // 设备状态
825
1044
  if (data.onlineState === 1) {
826
1045
  // 监控中
827
1046
  if (data.monitor === 1 || data.beMonitor === 1) {
@@ -863,12 +1082,26 @@ const getDisabled = (config, node) => {
863
1082
  if (isFunction(disabled))
864
1083
  return disabled(node.data, node);
865
1084
  };
1085
+ const isShowSelect = (config, node = null) => {
1086
+ const { showSelect } = config.rowSelection;
1087
+ if (isBoolean(showSelect) || node === null)
1088
+ return !!showSelect;
1089
+ const { isShowChannelSelect } = config.businessConfig;
1090
+ if (config.business === Business.CHANNEL && !isShowChannelSelect && node.data.dataType === DataType.CHANNEL)
1091
+ return false;
1092
+ return !!(isFunction(showSelect) && showSelect(node.data, node));
1093
+ };
1094
+ const isCheckLeaf = (config, node) => {
1095
+ if (config.business !== Business.CHANNEL || config.businessConfig.isShowChannelSelect)
1096
+ return node.isLeaf;
1097
+ return node.data.dataType === 3 ? true : node.isLeaf;
1098
+ };
866
1099
  function useCheck(props, tree) {
867
1100
  const checkedKeys = new Set();
868
1101
  let indeterminateKeys = new Set();
869
1102
  const updateCheckedKeys = () => {
870
- const { showSelect, checkStrictly } = props.rowSelection;
871
- if (!tree || !showSelect || checkStrictly) {
1103
+ const { checkStrictly } = props.rowSelection;
1104
+ if (!tree || checkStrictly) {
872
1105
  return;
873
1106
  }
874
1107
  const { levelTreeNodeMap, maxLevel } = tree;
@@ -879,28 +1112,39 @@ function useCheck(props, tree) {
879
1112
  if (!nodes)
880
1113
  continue;
881
1114
  nodes.forEach((node) => {
882
- const children = node.children;
883
- if (tree.hiddenNodeKeySet.has(node.key))
1115
+ if (tree.hiddenNodeKeySet.has(node.key) || !isShowSelect(props, node))
884
1116
  return;
885
- if (children) {
1117
+ if (node.children && !isCheckLeaf(props, node)) {
886
1118
  let allChecked = true;
887
1119
  let hasChecked = false;
888
- for (const childNode of children) {
1120
+ let allHide = true;
1121
+ for (const childNode of node.children) {
889
1122
  const key = childNode.key;
890
- if (tree.hiddenNodeKeySet.has(key))
1123
+ // 通道需要循环处理
1124
+ if (childNode.data.dataType !== DataType.CHANNEL &&
1125
+ (tree.hiddenNodeKeySet.has(key) || !isShowSelect(props, node))) {
891
1126
  continue;
892
- if (checkedKeySet.has(key)) {
893
- hasChecked = true;
894
- }
895
- else if (indeterminateKeySet.has(key)) {
896
- allChecked = false;
897
- hasChecked = true;
898
- break;
899
1127
  }
900
- else {
901
- allChecked = false;
1128
+ if ((props.businessConfig?.showOnlineState && childNode.data.deviceStatus !== DeviceStatus.OFF_LINE) ||
1129
+ !props.businessConfig?.showOnlineState) {
1130
+ allHide = false;
1131
+ if (checkedKeySet.has(key)) {
1132
+ hasChecked = true;
1133
+ }
1134
+ else if (indeterminateKeySet.has(key)) {
1135
+ allChecked = false;
1136
+ hasChecked = true;
1137
+ break;
1138
+ }
1139
+ else {
1140
+ allChecked = false;
1141
+ }
902
1142
  }
903
1143
  }
1144
+ // 所有子元素都隐藏,则判断自身的选中状态
1145
+ if (allHide) {
1146
+ allChecked = checkedKeySet.has(node.key);
1147
+ }
904
1148
  if (allChecked) {
905
1149
  checkedKeySet.add(node.key);
906
1150
  }
@@ -942,7 +1186,7 @@ function useCheck(props, tree) {
942
1186
  const children = node.children;
943
1187
  if ((!checkStrictly || checkOnDbclick) && children) {
944
1188
  children.forEach((childNode) => {
945
- if (!getDisabled(props, childNode)) {
1189
+ if (!getDisabled(props, childNode) && isShowSelect(props, childNode)) {
946
1190
  toggle(childNode, checked);
947
1191
  }
948
1192
  });
@@ -999,21 +1243,47 @@ function useCheck(props, tree) {
999
1243
  const checkedBusinessKeys = [];
1000
1244
  const checkedBusinessNodes = [];
1001
1245
  const { business } = props;
1002
- if (tree && props.rowSelection.showSelect) {
1246
+ if (tree && isShowSelect(props)) {
1003
1247
  const { treeNodeMap } = tree;
1004
1248
  checkedKeys.forEach((key) => {
1005
1249
  const node = treeNodeMap.get(key);
1006
- if (node && (!leafOnly || (leafOnly && node.isLeaf))) {
1250
+ if (!node || !isShowSelect(props, node))
1251
+ return;
1252
+ if (!leafOnly || (leafOnly && isCheckLeaf(props, node))) {
1007
1253
  const data = node.data;
1008
1254
  keys.push(key);
1009
1255
  checkedNodes.push(data);
1010
1256
  // 业务选中
1011
- if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3)
1012
- || (business === 'user' && data.dataType === 5)
1013
- || (business === 'cs' && data.dataType === 8)) {
1257
+ if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3) ||
1258
+ (business === 'user' && data.dataType === 5) ||
1259
+ (business === 'cs' && data.dataType === 8)) {
1014
1260
  checkedBusinessKeys.push(key);
1015
1261
  checkedBusinessNodes.push(node.data);
1016
1262
  }
1263
+ // 通道类型业务选中
1264
+ else if (business === Business.CHANNEL && /^(3|9)$/.test(`${data.dataType}`)) {
1265
+ // 开启通道可选中
1266
+ if (props.businessConfig?.isShowChannelSelect) {
1267
+ // 通道类型 或 没有通道的设备
1268
+ if (data.dataType === 9 || isCheckLeaf(props, node)) {
1269
+ checkedBusinessKeys.push(key);
1270
+ if (data.dataType === 9) {
1271
+ checkedBusinessNodes.push({
1272
+ ...node.parent.data,
1273
+ ...node.data
1274
+ });
1275
+ }
1276
+ else {
1277
+ checkedBusinessNodes.push(node.data);
1278
+ }
1279
+ }
1280
+ }
1281
+ // 关闭通道可选中
1282
+ else if (data.dataType === 3) {
1283
+ checkedBusinessKeys.push(key);
1284
+ checkedBusinessNodes.push(node.data);
1285
+ }
1286
+ }
1017
1287
  }
1018
1288
  });
1019
1289
  }
@@ -1035,14 +1305,14 @@ function useCheck(props, tree) {
1035
1305
  function getHalfChecked() {
1036
1306
  const halfCheckedNodes = [];
1037
1307
  const halfCheckedKeys = [];
1038
- if (tree && props.rowSelection.showSelect) {
1308
+ if (tree && isShowSelect(props)) {
1039
1309
  const { treeNodeMap } = tree;
1040
1310
  indeterminateKeys.forEach((key) => {
1041
1311
  const node = treeNodeMap.get(key);
1042
- if (node) {
1043
- halfCheckedKeys.push(key);
1044
- halfCheckedNodes.push(node.data);
1045
- }
1312
+ if (!node || !isShowSelect(props, node))
1313
+ return;
1314
+ halfCheckedKeys.push(key);
1315
+ halfCheckedNodes.push(node.data);
1046
1316
  });
1047
1317
  }
1048
1318
  return {
@@ -1064,45 +1334,118 @@ function useCheck(props, tree) {
1064
1334
  _setCheckedKeys(keys, isBusiness);
1065
1335
  }
1066
1336
  function setChecked(key, isChecked, isBusiness = false) {
1337
+ if (!tree || !isShowSelect(props))
1338
+ return;
1339
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1340
+ if (!isBusiness || !props.business) {
1341
+ const node = treeNodeMap.get(key);
1342
+ if (node) {
1343
+ toggleCheckbox(node, isChecked, false);
1344
+ }
1345
+ return;
1346
+ }
1347
+ let nodeList = [];
1348
+ switch (props.business) {
1349
+ case Business.DEVICE:
1350
+ case Business.GROUP_DEVICE:
1351
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1352
+ break;
1353
+ case Business.CHANNEL:
1354
+ const channel = channelMap && channelMap.get(key);
1355
+ if (channel) {
1356
+ nodeList = [channel];
1357
+ }
1358
+ else {
1359
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1360
+ }
1361
+ break;
1362
+ case Business.USER:
1363
+ nodeList = (userMap && userMap.get(key)) || [];
1364
+ break;
1365
+ case Business.CS:
1366
+ nodeList = (csMap && csMap.get(key)) || [];
1367
+ break;
1368
+ }
1369
+ for (const node of nodeList) {
1370
+ if (!isShowSelect(props, node))
1371
+ continue;
1372
+ toggleCheckbox(node, isChecked, false);
1373
+ }
1374
+ }
1375
+ function _setCheckedKeys(keys = [], isBusiness = false) {
1067
1376
  if (!tree)
1068
1377
  return;
1069
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1070
- if (props.rowSelection.showSelect) {
1378
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1379
+ if (!isShowSelect(props) || !treeNodeMap || !keys.length)
1380
+ return;
1381
+ for (const key of keys) {
1382
+ // 通用逻辑
1071
1383
  if (!isBusiness || !props.business) {
1072
1384
  const node = treeNodeMap.get(key);
1073
- if (node) {
1074
- toggleCheckbox(node, isChecked, false);
1385
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1386
+ toggleCheckbox(node, true, false, false);
1075
1387
  }
1076
- return;
1388
+ continue;
1077
1389
  }
1390
+ // 业务逻辑
1078
1391
  let nodeList = [];
1079
1392
  switch (props.business) {
1080
- case 'device':
1081
- case 'groupDevice':
1393
+ case Business.DEVICE:
1394
+ case Business.GROUP_DEVICE:
1082
1395
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1083
1396
  break;
1084
- case 'user':
1397
+ case Business.CHANNEL:
1398
+ const channel = channelMap && channelMap.get(key);
1399
+ if (channel) {
1400
+ nodeList = [channel];
1401
+ }
1402
+ else {
1403
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1404
+ }
1405
+ break;
1406
+ case Business.USER:
1085
1407
  nodeList = (userMap && userMap.get(key)) || [];
1086
1408
  break;
1087
- case 'cs':
1409
+ case Business.CS:
1088
1410
  nodeList = (csMap && csMap.get(key)) || [];
1089
1411
  break;
1090
1412
  }
1091
1413
  for (const node of nodeList) {
1092
- toggleCheckbox(node, isChecked, false);
1414
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1415
+ toggleCheckbox(node, true, false, false);
1416
+ }
1093
1417
  }
1094
1418
  }
1419
+ updateCheckedKeys();
1095
1420
  }
1096
- function _setCheckedKeys(keys = [], isBusiness = false) {
1097
- if (!tree)
1421
+ function setCheckedNodes(data, isBusiness = false) {
1422
+ if (!Array.isArray(data)) {
1423
+ console.warn('setCheckedNodes请传入数组');
1098
1424
  return;
1099
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1100
- if (props.rowSelection.showSelect && treeNodeMap && keys.length > 0) {
1101
- for (const key of keys) {
1425
+ }
1426
+ const { type } = props.rowSelection;
1427
+ checkedKeys.clear();
1428
+ indeterminateKeys.clear();
1429
+ if (type === 'radio' && data.length > 1) {
1430
+ data = [data[0]];
1431
+ }
1432
+ _setCheckedNodes(data, isBusiness);
1433
+ }
1434
+ function _setCheckedNodes(data = [], isBusiness = false) {
1435
+ if (tree) {
1436
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1437
+ if (!isShowSelect(props) || !treeNodeMap || !data.length)
1438
+ return;
1439
+ const { getKey } = useHandleFun({
1440
+ business: props.business,
1441
+ props: props.props
1442
+ });
1443
+ for (const target of data) {
1102
1444
  // 通用逻辑
1445
+ let key = getKey(target);
1103
1446
  if (!isBusiness || !props.business) {
1104
1447
  const node = treeNodeMap.get(key);
1105
- if (node && !isChecked(node)) {
1448
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1106
1449
  toggleCheckbox(node, true, false, false);
1107
1450
  }
1108
1451
  continue;
@@ -1110,19 +1453,32 @@ function useCheck(props, tree) {
1110
1453
  // 业务逻辑
1111
1454
  let nodeList = [];
1112
1455
  switch (props.business) {
1113
- case 'device':
1114
- case 'groupDevice':
1456
+ case Business.DEVICE:
1457
+ case Business.GROUP_DEVICE:
1458
+ key = target.deviceId;
1115
1459
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1116
1460
  break;
1117
- case 'user':
1461
+ case Business.CHANNEL:
1462
+ key = target.channelId;
1463
+ const channel = channelMap && channelMap.get(key);
1464
+ if (channel) {
1465
+ nodeList = [channel];
1466
+ }
1467
+ else {
1468
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1469
+ }
1470
+ break;
1471
+ case Business.USER:
1472
+ key = target.id;
1118
1473
  nodeList = (userMap && userMap.get(key)) || [];
1119
1474
  break;
1120
- case 'cs':
1475
+ case Business.CS:
1476
+ key = target.id;
1121
1477
  nodeList = (csMap && csMap.get(key)) || [];
1122
1478
  break;
1123
1479
  }
1124
1480
  for (const node of nodeList) {
1125
- if (node && !isChecked(node)) {
1481
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1126
1482
  toggleCheckbox(node, true, false, false);
1127
1483
  }
1128
1484
  }
@@ -1130,61 +1486,6 @@ function useCheck(props, tree) {
1130
1486
  updateCheckedKeys();
1131
1487
  }
1132
1488
  }
1133
- function setCheckedNodes(data, isBusiness = false) {
1134
- if (!Array.isArray(data)) {
1135
- console.warn('setCheckedNodes请传入数组');
1136
- return;
1137
- }
1138
- const { type } = props.rowSelection;
1139
- checkedKeys.clear();
1140
- indeterminateKeys.clear();
1141
- if (type === 'radio' && data.length > 1) {
1142
- data = [data[0]];
1143
- }
1144
- _setCheckedNodes(data, isBusiness);
1145
- }
1146
- function _setCheckedNodes(data = [], isBusiness = false) {
1147
- if (tree) {
1148
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1149
- if (props.rowSelection.showSelect && treeNodeMap && data.length > 0) {
1150
- const { getKey } = useHandleFun(props);
1151
- for (const target of data) {
1152
- // 通用逻辑
1153
- let key = getKey(target);
1154
- if (!isBusiness || !props.business) {
1155
- const node = treeNodeMap.get(key);
1156
- if (node && !isChecked(node)) {
1157
- toggleCheckbox(node, true, false, false);
1158
- }
1159
- continue;
1160
- }
1161
- // 业务逻辑
1162
- let nodeList = [];
1163
- switch (props.business) {
1164
- case 'device':
1165
- case 'groupDevice':
1166
- key = target.deviceId;
1167
- nodeList = (deviceMap && deviceMap.get(key)) || [];
1168
- break;
1169
- case 'user':
1170
- key = target.id;
1171
- nodeList = (userMap && userMap.get(key)) || [];
1172
- break;
1173
- case 'cs':
1174
- key = target.id;
1175
- nodeList = (csMap && csMap.get(key)) || [];
1176
- break;
1177
- }
1178
- for (const node of nodeList) {
1179
- if (node && !isChecked(node)) {
1180
- toggleCheckbox(node, true, false, false);
1181
- }
1182
- }
1183
- }
1184
- updateCheckedKeys();
1185
- }
1186
- }
1187
- }
1188
1489
  return {
1189
1490
  checkedKeys,
1190
1491
  updateCheckedKeys,
@@ -1219,7 +1520,6 @@ function useFilter(config, filterMethod, tree = {
1219
1520
  if (!isFunction(filterMethod)) {
1220
1521
  return;
1221
1522
  }
1222
- const { integratedBusiness } = config.businessConfig;
1223
1523
  const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
1224
1524
  const isCountFiler = countFilter && isFunction(countFilter);
1225
1525
  const isTotalFiler = totalFilter && isFunction(totalFilter);
@@ -1230,37 +1530,21 @@ function useFilter(config, filterMethod, tree = {
1230
1530
  const nodes = tree.treeNodes || [];
1231
1531
  hiddenKeys.clear();
1232
1532
  function traverse(nodes, isShow = false) {
1233
- const deepBusinessList = [];
1234
1533
  let count = 0;
1235
1534
  let total = 0;
1236
1535
  nodes.forEach((node) => {
1237
- const businessList = [];
1238
1536
  family.push(node);
1239
1537
  if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
1240
1538
  family.forEach((member) => {
1241
1539
  expandKeySet.add(member.key);
1242
1540
  });
1243
- if (integratedBusiness && !/^1|4$/.test(node.data.dataType)) {
1244
- businessList.push(node.data);
1245
- deepBusinessList.push(node.data);
1246
- }
1247
1541
  }
1248
1542
  else if (node.isLeaf) {
1249
1543
  hiddenKeys.add(node.key);
1250
1544
  }
1251
1545
  const children = node.children;
1252
1546
  if (children) {
1253
- const { count: childCount, total: childTotal, businessList: list2 } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1254
- // 保存下层业务数据
1255
- if (integratedBusiness) {
1256
- for (const target of list2) {
1257
- if (!/^1|4$/.test(target.dataType)) {
1258
- businessList.push(target);
1259
- deepBusinessList.push(target);
1260
- }
1261
- }
1262
- node.data.childrenDeviceList = businessList;
1263
- }
1547
+ const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1264
1548
  node.count = isCountFiler ? childCount : getCount(node);
1265
1549
  node.total = isTotalFiler ? childTotal : getTotal(node);
1266
1550
  count += childCount;
@@ -1301,7 +1585,95 @@ function useFilter(config, filterMethod, tree = {
1301
1585
  }
1302
1586
  family.pop();
1303
1587
  });
1304
- return { count, total, businessList: deepBusinessList };
1588
+ return { count, total };
1589
+ }
1590
+ traverse(nodes);
1591
+ return expandKeySet;
1592
+ }
1593
+ // 通道过滤方法
1594
+ function channelFilter(params, filterAll = true) {
1595
+ if (!isFunction(filterMethod)) {
1596
+ return;
1597
+ }
1598
+ const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
1599
+ const isCountFiler = countFilter && isFunction(countFilter);
1600
+ const isTotalFiler = totalFilter && isFunction(totalFilter);
1601
+ const expandKeySet = new Set();
1602
+ const hiddenExpandIconKeys = hiddenExpandIconKeySet;
1603
+ const hiddenKeys = hiddenNodeKeySet;
1604
+ const family = [];
1605
+ const nodes = tree.treeNodes || [];
1606
+ hiddenKeys.clear();
1607
+ // 是否为过滤的根节点
1608
+ const isFilterLeaf = (node) => {
1609
+ if (config.business !== Business.CHANNEL)
1610
+ return node.isLeaf;
1611
+ return node.data.dataType === 3 || node.isLeaf;
1612
+ };
1613
+ function traverse(nodes, isShow = false) {
1614
+ let count = 0;
1615
+ let total = 0;
1616
+ nodes.forEach((node) => {
1617
+ const isLeaf = isFilterLeaf(node);
1618
+ family.push(node);
1619
+ if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
1620
+ family.forEach((member) => {
1621
+ expandKeySet.add(member.key);
1622
+ });
1623
+ }
1624
+ else if (isLeaf) {
1625
+ hiddenKeys.add(node.key);
1626
+ }
1627
+ const children = node.children;
1628
+ if (children) {
1629
+ if (!isLeaf) {
1630
+ const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1631
+ node.count = isCountFiler ? childCount : getCount(node);
1632
+ node.total = isTotalFiler ? childTotal : getTotal(node);
1633
+ count += childCount;
1634
+ total += childTotal;
1635
+ }
1636
+ else if (!hiddenKeys.has(node.key)) {
1637
+ count++;
1638
+ total++;
1639
+ }
1640
+ }
1641
+ else if (!hiddenKeys.has(node.key)) {
1642
+ node.count = 0;
1643
+ node.total = 0;
1644
+ // 统计,当仅展示在线时,不统计离线的设备
1645
+ if (!tree.hiddenNodeKeySet.has(node.key)) {
1646
+ if (isCountFiler && countFilter) {
1647
+ count += countFilter(node.data) ? 1 : 0;
1648
+ }
1649
+ if (isTotalFiler && totalFilter) {
1650
+ total += totalFilter(node.data) ? 1 : 0;
1651
+ }
1652
+ }
1653
+ }
1654
+ if (!isLeaf) {
1655
+ if (!expandKeySet.has(node.key)) {
1656
+ hiddenKeys.add(node.key);
1657
+ }
1658
+ else if (children) {
1659
+ let allHidden = true;
1660
+ for (const childNode of children) {
1661
+ if (!hiddenKeys.has(childNode.key)) {
1662
+ allHidden = false;
1663
+ break;
1664
+ }
1665
+ }
1666
+ if (allHidden) {
1667
+ hiddenExpandIconKeys.add(node.key);
1668
+ }
1669
+ else {
1670
+ hiddenExpandIconKeys.delete(node.key);
1671
+ }
1672
+ }
1673
+ }
1674
+ family.pop();
1675
+ });
1676
+ return { count, total };
1305
1677
  }
1306
1678
  traverse(nodes);
1307
1679
  return expandKeySet;
@@ -1382,9 +1754,12 @@ function useFilter(config, filterMethod, tree = {
1382
1754
  return hiddenExpandIconKeySet.has(node.key);
1383
1755
  }
1384
1756
  switch (config.business) {
1385
- case 'group':
1757
+ case Business.GROUP:
1386
1758
  doFilter = doGroupFilter;
1387
1759
  break;
1760
+ case Business.CHANNEL:
1761
+ doFilter = channelFilter;
1762
+ break;
1388
1763
  default:
1389
1764
  doFilter = commitFilter;
1390
1765
  break;
@@ -1404,7 +1779,7 @@ const useStatus = (config, data, node) => {
1404
1779
  return;
1405
1780
  const el = document.createElement('div');
1406
1781
  // 设备树
1407
- if (['device', 'groupDevice'].includes(`${business}`)) {
1782
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
1408
1783
  if (data.dataType !== 3)
1409
1784
  return;
1410
1785
  el.classList.add('hy-tree-node__status');
@@ -1445,12 +1820,31 @@ function checkDeviceTypeFn(config, data) {
1445
1820
  return `${svgName}${data.onlineState === 1 || !config.props.showStatus ? '' : '_offLine'}`;
1446
1821
  }
1447
1822
  const useIcon = (config, data, node) => {
1448
- if ((['device', 'groupDevice'].includes(config.business) && data.dataType === 3)) {
1823
+ // 设备
1824
+ if ((/^(device|channel|groupDevice)$/.test(config.business) && data.dataType === 3)) {
1449
1825
  return new Icon({
1450
1826
  svgName: checkDeviceTypeFn(config, data) + '_svg'
1451
1827
  });
1452
1828
  }
1453
- else if ((config.business === 'cs' && data.dataType === 8)) {
1829
+ // 通道
1830
+ else if (config.business === Business.CHANNEL && data.dataType === 9) {
1831
+ const globalDeviceStatus = getGlobalDeviceStatus();
1832
+ // 在线
1833
+ let extendName = '', tip = globalDeviceStatus[1];
1834
+ // 离线
1835
+ if (data.deviceStatus === 0) {
1836
+ extendName = '_offLine';
1837
+ tip = globalDeviceStatus[0];
1838
+ }
1839
+ // 监控中
1840
+ else if (data.deviceStatus === 2) {
1841
+ extendName = '_monitor';
1842
+ tip = globalDeviceStatus[2];
1843
+ }
1844
+ return new Icon({ svgName: `video_channel${extendName}_svg`, width: 12, height: 12, tip });
1845
+ }
1846
+ // 采集器
1847
+ else if (config.business === 'cs' && data.dataType === 8) {
1454
1848
  return new Icon({ svgName: 'menu_acquisitionStation_svg' });
1455
1849
  }
1456
1850
  };
@@ -1476,15 +1870,20 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
1476
1870
  };
1477
1871
  }
1478
1872
 
1479
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOWkhOeQhuWHveaVsCAqLwogIGNvbnN0IHVzZUhhbmRsZUZ1biA9IChjb25maWcpID0+IHsKICAgICAgY29uc3QgeyBidXNpbmVzcyB9ID0gY29uZmlnOwogICAgICBjb25zdCBwcm9wcyA9IHsgLi4uY29uZmlnLnByb3BzIH07CiAgICAgIGxldCB7IGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gcHJvcHM7CiAgICAgIC8qKiDojrflj5ZrZXnlgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0S2V5KG5vZGUsIGlzQnVzaW5lc3MgPSBmYWxzZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIGlmIChidXNpbmVzcyAmJiBpc0J1c2luZXNzKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChidXNpbmVzcykgewogICAgICAgICAgICAgICAgICBjYXNlICdkZXZpY2UnOgogICAgICAgICAgICAgICAgICBjYXNlICdncm91cERldmljZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgY2FzZSAndXNlcic6CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2NzJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlkOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBub2RlW3Byb3BzLnZhbHVlXTsKICAgICAgfQogICAgICAvKiog6I635Y+WbGFiZWzlgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0TGFiZWwobm9kZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIHJldHVybiBub2RlW3Byb3BzLmxhYmVsXTsKICAgICAgfQogICAgICAvKiog6I635Y+WY2hpbGRyZW7lgLwgKi8KICAgICAgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSkgewogICAgICAgICAgaWYgKCFub2RlKQogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZVtwcm9wcy5jaGlsZHJlbl07CiAgICAgICAgICByZXR1cm4gY2hpbGRyZW4gPyBbLi4uY2hpbGRyZW5dIDogW107CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNvdW505YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENvdW50KG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5jb3VudF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlnRvdGFs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldFRvdGFsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy50b3RhbF07CiAgICAgIH0KICAgICAgaWYgKFsnZGV2aWNlJywgJ2dyb3VwRGV2aWNlJ10uaW5jbHVkZXMoYCR7YnVzaW5lc3N9YCkpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gMyAmJiBkYXRhLm9ubGluZVN0YXRlID09PSAxOwogICAgICAgICAgfTsKICAgICAgICAgIHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gMzsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnVzaW5lc3MgPT09ICd1c2VyJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDU7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAnY3MnKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gODsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICAgIGdldEtleSwKICAgICAgICAgIGdldExhYmVsLAogICAgICAgICAgZ2V0Q2hpbGRyZW4sCiAgICAgICAgICBnZXRDb3VudCwKICAgICAgICAgIGdldFRvdGFsLAogICAgICAgICAgY291bnRGaWx0ZXIsCiAgICAgICAgICB0b3RhbEZpbHRlciwKICAgICAgICAgIC8vIOiuvue9ruiuvuWkh+eKtuaAgQogICAgICAgICAgc2V0RGV2aWNlU3RhdHVzOiAoZGF0YSkgPT4gewogICAgICAgICAgICAgIGlmIChkYXRhLm9ubGluZVN0YXRlID09PSAxKSB7CiAgICAgICAgICAgICAgICAgIC8vIOebkeaOp+S4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb25pdG9yID09PSAxIHx8IGRhdGEuYmVNb25pdG9yID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJror53kuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmlkZW9DYWxsID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXlg4/kuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmlkZW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW9lemfs+S4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5hdWRpb1JlY29yZGluZyA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5bm/5pKt5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmJyb2FkY2FzdCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8gU09TCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnNvcyA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5Zyo57q/CiAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDnprvnur8KICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgfTsKICB9OwoKICBjb25zdCBpc1N0cmluZyA9IChlKSA9PiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7CiAgY29uc3QgaXNOdW1iZXIgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdudW1iZXInOwogIGNvbnN0IGlzQXJyYXkgPSAoZSkgPT4gQXJyYXkuaXNBcnJheShlKTsKCiAgLy8g5aSE55CGZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gaGFuZGxlRmlsdGVyQ29uZmlnKGZpbHRlckNvbmZpZykgewogICAgICByZXR1cm4gKGZpbHRlckNvbmZpZyB8fCBbXSkuZmlsdGVyKChpdGVtKSA9PiB7CiAgICAgICAgICByZXR1cm4gKGlzU3RyaW5nKGl0ZW0ucHJvcCkgJiYKICAgICAgICAgICAgICAoaXNTdHJpbmcoaXRlbS52YWx1ZSkgfHwKICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoaXRlbS52YWx1ZSkgfHwKICAgICAgICAgICAgICAgICAgKGlzQXJyYXkoaXRlbS52YWx1ZSkgJiYgaXRlbS5jb25kaXRpb24gPT09ICdiZXR3ZWVuJykpICYmCiAgICAgICAgICAgICAgL14oZXF8bmV8aW58bm90SW58YmV0d2VlbnxndHxsdHxnZXxsZSkkLy50ZXN0KGl0ZW0uY29uZGl0aW9uKSk7CiAgICAgIH0pOwogIH0KICAvLyDmoKHpqoxmaWx0ZXJDb25maWcKICBmdW5jdGlvbiB1c2VGaWx0ZXJDb25maWcoZGF0YSwgZmlsdGVyTGlzdCkgewogICAgICBpZiAoIWZpbHRlckxpc3QgfHwgIWZpbHRlckxpc3QubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmaWx0ZXJMaXN0LmV2ZXJ5KCh7IHByb3AsIHZhbHVlLCBjb25kaXRpb24gfSkgPT4gewogICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YVtwcm9wXTsKICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgY2FzZSAnZXEnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSB2YWx1ZTsKICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgIT09IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2JldHdlZW4nKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0ID49IHZhbHVlWzBdICYmIHRhcmdldCA8PSB2YWx1ZVsxXQogICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOdW1iZXIodGFyZ2V0KSkgewogICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKQogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3QnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA+IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsdCc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDwgdmFsdWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2dlJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPj0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPD0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNTdHJpbmcodGFyZ2V0KSkgewogICAgICAgICAgICAgIGNvbnN0IGlzSW4gPSB0YXJnZXQuaW5jbHVkZXMoYCR7dmFsdWV9YCk7CiAgICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnaW4nOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW47CiAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdEluJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNJbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0pOwogIH0KCiAgc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgeyBkYXRhLCBjb25maWcgfSA9IGV2ZW50LmRhdGE7CiAgICAgIGNvbnN0IGdlbmVyYXRlVHJlZSA9IGdlbmVyYXRlTWFwW2NvbmZpZy5idXNpbmVzc107CiAgICAgIGlmICghZ2VuZXJhdGVUcmVlKSB7CiAgICAgICAgICBzZWxmLmNsb3NlKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgdHJlZSA9IGdlbmVyYXRlVHJlZShkYXRhLCBjb25maWcpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHRyZWUpOwogIH07CiAgLy8g6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDorr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4Torr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzOiBzZXREZXZpY2VTdGF0dXModikgLy8g6K6+5aSH54q25oCBCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5kZXZpY2VTdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3Rbc29ydEJ5U3RhdHVzID8gMSA6IDBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOagkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbn0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVHcm91cFRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlVG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAodi5vbmxpbmVTdGF0ZSA9PT0gMSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0sIGRldmljZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRvdGFsID0gcmF3Tm9kZS5kZXZpY2VMaXN0Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIflkoznvqTnu4TnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlpITnkIbpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYubmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDUsIC8vIOS7o+ihqOeUqOaItwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g55So5oi3CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IHVzZXJNYXAuZ2V0KGlkKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaXN0LnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICB1c2VyTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlVXNlclRyZWUoZGF0YSk7CiAgfQogIC8vIOmHh+mbhuermeagkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlQ3NUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDph4fpm4bnq5nmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlQ3NUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmNzTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuY3NMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5zbmFtZSB8fCB2LnNjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDgsIC8vIOS7o+ihqOmHh+mbhuermQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInph4fpm4blmajnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YeH6ZuG56uZCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IGNzTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgY3NNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGNzTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlQ3NUcmVlKGRhdGEpOwogIH0KICBjb25zdCBnZW5lcmF0ZU1hcCA9IHsKICAgICAgLy8g6K6+5aSH5qCRCiAgICAgIGRldmljZTogZ2VuZXJhdGVEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4Torr7lpIfmoJEKICAgICAgZ3JvdXBEZXZpY2U6IGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4TmoJEKICAgICAgZ3JvdXA6IGdlbmVyYXRlR3JvdXBUcmVlLAogICAgICAvLyDnlKjmiLfmoJEKICAgICAgdXNlcjogZ2VuZXJhdGVVc2VyVHJlZSwKICAgICAgLy8g6YeH6ZuG56uZCiAgICAgIGNzOiBnZW5lcmF0ZUNzVHJlZQogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1nZW5lcmF0ZVRyZWUuanMubWFwCgo=');
1873
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8g5Lia5Yqh57G75Z6LKGNvbmZpZy5idXNpbmVzcykgZGV2aWNlLeiuvuWkhyBjaGFubmVsLemAmumBk+iuvuWkhyBncm91cERldmljZS3nvqTnu4Torr7lpIcgZ3JvdXAt576k57uEIHVzZXIt55So5oi3IGNzLemHh+mbhuermQogIHZhciBCdXNpbmVzczsKICAoZnVuY3Rpb24gKEJ1c2luZXNzKSB7CiAgICAgIEJ1c2luZXNzWyJERVZJQ0UiXSA9ICJkZXZpY2UiOwogICAgICBCdXNpbmVzc1siQ0hBTk5FTCJdID0gImNoYW5uZWwiOwogICAgICBCdXNpbmVzc1siR1JPVVBfREVWSUNFIl0gPSAiZ3JvdXBEZXZpY2UiOwogICAgICBCdXNpbmVzc1siR1JPVVAiXSA9ICJncm91cCI7CiAgICAgIEJ1c2luZXNzWyJVU0VSIl0gPSAidXNlciI7CiAgICAgIEJ1c2luZXNzWyJDUyJdID0gImNzIjsKICB9KShCdXNpbmVzcyB8fCAoQnVzaW5lc3MgPSB7fSkpOwogIC8vIOiuvuWkh+eKtuaAgShkYXRhLmRldmljZVN0YXR1cykgMC3nprvnur8gMS3lnKjnur8gMi3nm5HmjqfkuK0gMy3pgJror53kuK0gNC3lvZXlg4/kuK0gNS3lvZXpn7PkuK0gNi3lub/mkq3kuK0gNy1TT1MKICB2YXIgRGV2aWNlU3RhdHVzOwogIChmdW5jdGlvbiAoRGV2aWNlU3RhdHVzKSB7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9GRl9MSU5FIl0gPSAwXSA9ICJPRkZfTElORSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9OX0xJTkUiXSA9IDFdID0gIk9OX0xJTkUiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJCRV9NT05JVE9SIl0gPSAyXSA9ICJCRV9NT05JVE9SIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQ0FMTCJdID0gM10gPSAiSU5fQ0FMTCI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIklOX1ZJREVPX1JFQ09SRCJdID0gNF0gPSAiSU5fVklERU9fUkVDT1JEIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQVVESU9fUkVDT1JEIl0gPSA1XSA9ICJJTl9BVURJT19SRUNPUkQiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJJTl9CUk9BRENBU0UiXSA9IDZdID0gIklOX0JST0FEQ0FTRSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIlNPUyJdID0gN10gPSAiU09TIjsgLy8gU09TCiAgfSkoRGV2aWNlU3RhdHVzIHx8IChEZXZpY2VTdGF0dXMgPSB7fSkpOwogIC8vIOS4muWKoeaVsOaNruexu+WeiyhkYXRhLmRhdGFUeXBlKSAxLemDqOmXqCAzLeiuvuWkhyA0Lee+pOe7hCA1LeeUqOaItyA2LeiAg+WLpCA3LeawtOa6kOeCuSA4LemHh+mbhuermSA5LeiuvuWkh+mAmumBkwogIHZhciBEYXRhVHlwZTsKICAoZnVuY3Rpb24gKERhdGFUeXBlKSB7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMSJdID0gMF0gPSAiVU5LTk9XXzEiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVQVCJdID0gMV0gPSAiREVQVCI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMiJdID0gMl0gPSAiVU5LTk9XXzIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVWSUNFIl0gPSAzXSA9ICJERVZJQ0UiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiR1JPVVAiXSA9IDRdID0gIkdST1VQIjsKICAgICAgRGF0YVR5cGVbRGF0YVR5cGVbIlVTRVIiXSA9IDVdID0gIlVTRVIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQVRURU5EQU5DRSJdID0gNl0gPSAiQVRURU5EQU5DRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJXQVRFUl9TT1VSQ0UiXSA9IDddID0gIldBVEVSX1NPVVJDRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJDUyJdID0gOF0gPSAiQ1MiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQ0hBTk5FTCJdID0gOV0gPSAiQ0hBTk5FTCI7IC8vIOiuvuWkh+mAmumBkwogIH0pKERhdGFUeXBlIHx8IChEYXRhVHlwZSA9IHt9KSk7CgogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5kZXZpY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuREVQVDogLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuR1JPVVA6IC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlVTRVI6IC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkNTOiAvLyDph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlkOwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRFVklDRTogLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DSEFOTkVMOiAvLyDorr7lpIfpgJrpgZMKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNoYW5uZWxJZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChidXNpbmVzcyAmJiBbQnVzaW5lc3MuREVWSUNFLCBCdXNpbmVzcy5DSEFOTkVMLCBCdXNpbmVzcy5HUk9VUF9ERVZJQ0VdLmluY2x1ZGVzKGJ1c2luZXNzKSkgewogICAgICAgICAgY291bnRGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzICYmIGRhdGEub25saW5lU3RhdGUgPT09IDE7CiAgICAgICAgICB9OwogICAgICAgICAgdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzOwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ3VzZXInKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gNTsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnVzaW5lc3MgPT09ICdjcycpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA4OwogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgICAgZ2V0S2V5LAogICAgICAgICAgZ2V0TGFiZWwsCiAgICAgICAgICBnZXRDaGlsZHJlbiwKICAgICAgICAgIGdldENvdW50LAogICAgICAgICAgZ2V0VG90YWwsCiAgICAgICAgICBjb3VudEZpbHRlciwKICAgICAgICAgIHRvdGFsRmlsdGVyLAogICAgICAgICAgLy8g6K6+572u6K6+5aSH54q25oCBCiAgICAgICAgICBzZXREZXZpY2VTdGF0dXM6IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgLy8g6YCa6YGT54q25oCBCiAgICAgICAgICAgICAgaWYgKGRhdGEuZGV2aWNlVHlwZSA9PT0gOSkgewogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5o6n5LitCiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5iZU1vbml0b3IgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBoaWRkZW5Ob2RlS2V5U2V0ID0gbmV3IFNldCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBkZXZpY2VNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldAogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g6YCa6YGT6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDaGFubmVsRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjaGFubmVsTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDpnZ7orr7lpIfnsbvlnosKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IERhdGFUeXBlLkRFVklDRSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuREVWSUNFLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSBEZXZpY2VTdGF0dXMuT0ZGX0xJTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZGV2aWNlTGlzdFswXSwgLi4uZGV2aWNlTGlzdFsxXV07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5ERVBULCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBnZXRMYWJlbChyYXdOb2RlKSwKICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleVNldC5oYXModmFsdWUpCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6Z2e6K6+5aSH57G75Z6L5pWw5o2uCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UgJiYgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSAmJiBjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSH57G75Z6L5pWw5o2u77yM5LiU5pyJ6YCa6YGT5pWw5o2u5aSE55CGCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSBEYXRhVHlwZS5ERVZJQ0UgJiYgcmF3Tm9kZS52aWRlb0NoYW5uZWxMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxMZXZlbCA9IGxldmVsICsgMTsKICAgICAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMoY2hhbm5lbExldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGNoYW5uZWxMZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbExpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUudmlkZW9DaGFubmVsTGlzdC5mb3JFYWNoKChjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiByYXdOb2RlLm9ubHlJZCArICctJyArIGMuY2hhbm5lbElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYy5jaGFubmVsTmFtZSB8fCBjLmNoYW5uZWxJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkOiByYXdOb2RlLmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZTogcmF3Tm9kZS5kZXZOYW1lIHx8IHJhd05vZGUuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUub25seUlkICsgJy0nICsgYy5jaGFubmVsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYy5jaGFubmVsTmFtZSB8fCBjLmNoYW5uZWxJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5DSEFOTkVMLCAvLyDku6PooajpgJrpgZMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKGMpIC8vIOiuvuWkh+mAmumBk+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbC5kYXRhLmRldmljZVN0YXR1cyA9PT0gRGV2aWNlU3RhdHVzLk9GRl9MSU5FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKGNoYW5uZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChjaGFubmVsLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxMaXN0WzBdLnB1c2goY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXAuc2V0KGMuY2hhbm5lbElkLCBjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQoY2hhbm5lbC5rZXksIGNoYW5uZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGNoYW5uZWxMZXZlbCkucHVzaChjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hhbm5lbExpc3RbMF0sIC4uLmNoYW5uZWxMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGFubmVsTGlzdFswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gc2hvd09ubGluZVN0YXRlID8gbm9kZS5jb3VudCA6IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gTWF0aC5tYXgoY2hhbm5lbExldmVsLCBtYXhMZXZlbCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IERhdGFUeXBlLkRFVklDRSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBjaGFubmVsTWFwLAogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4Torr7lpIfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBoaWRkZW5Ob2RlS2V5U2V0ID0gbmV3IFNldCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzOiBzZXREZXZpY2VTdGF0dXModikgLy8g6K6+5aSH54q25oCBCiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5kZXZpY2VTdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3Rbc29ydEJ5U3RhdHVzID8gMSA6IDBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBkZXZpY2VNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldAogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g576k57uE5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVHcm91cFRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbn0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgLyoqIOe+pOe7hOagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVHcm91cFRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ291bnQgPSByYXdOb2RlLmRldmljZUxpc3QucmVkdWNlKCh2YWx1ZSwgdikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSArICh2Lm9ubGluZVN0YXRlID09PSAxID8gMSA6IDApOwogICAgICAgICAgICAgICAgICAgICAgfSwgZGV2aWNlQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVG90YWwgPSByYXdOb2RlLmRldmljZUxpc3QubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGRldmljZVRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+WSjOe+pOe7hOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWkhOeQhumAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlR3JvdXBUcmVlKGRhdGEpOwogIH0KICAvLyDnlKjmiLfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog55So5oi35qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVVzZXJUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB1c2VyTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYubmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDUsIC8vIOS7o+ihqOeUqOaItwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDnlKjmiLcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlck1hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICB1c2VyTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlVXNlclRyZWUoZGF0YSk7CiAgfQogIC8vIOmHh+mbhuermeagkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlQ3NUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6YeH6ZuG56uZ5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNzVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgY3NNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY3NMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5jc0xpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LnNuYW1lIHx8IHYuc2NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogOCwgLy8g5Luj6KGo6YeH6ZuG56uZCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInph4fpm4blmajnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgY3NNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVDc1RyZWUoZGF0YSk7CiAgfQogIGNvbnN0IGdlbmVyYXRlTWFwID0gewogICAgICAvLyDorr7lpIfmoJEKICAgICAgW0J1c2luZXNzLkRFVklDRV06IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g6YCa6YGT6K6+5aSH5qCRCiAgICAgIFtCdXNpbmVzcy5DSEFOTkVMXTogZ2VuZXJhdGVDaGFubmVsRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIFtCdXNpbmVzcy5HUk9VUF9ERVZJQ0VdOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIFtCdXNpbmVzcy5HUk9VUF06IGdlbmVyYXRlR3JvdXBUcmVlLAogICAgICAvLyDnlKjmiLfmoJEKICAgICAgW0J1c2luZXNzLlVTRVJdOiBnZW5lcmF0ZVVzZXJUcmVlLAogICAgICAvLyDph4fpm4bnq5kKICAgICAgW0J1c2luZXNzLkNTXTogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
1480
1874
  /* eslint-enable */
1481
1875
 
1482
1876
  // 设备树
1483
1877
  function updateDeviceTree(tree, data, config) {
1484
1878
  const deviceMap = tree.deviceMap || new Map();
1485
1879
  let beOnlineList = [], beOfflineList = [];
1880
+ const { businessConfig, hiddenNodeKeySet } = config;
1486
1881
  const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
1487
- const { sortByStatus, showOnlineState, integratedBusiness } = config.businessConfig;
1882
+ const { sortByStatus, showOnlineState } = businessConfig;
1883
+ // 是否参与统计
1884
+ const isStatistics = (key) => {
1885
+ return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
1886
+ };
1488
1887
  // 更新父节点统计
1489
1888
  const updateParnetCount = (keySet) => {
1490
1889
  const isCountFiler = countFilter && isFunction(countFilter);
@@ -1498,16 +1897,15 @@ function updateDeviceTree(tree, data, config) {
1498
1897
  let total = isTotalFiler ? 0 : target.data.total;
1499
1898
  const deviceList = [[], []];
1500
1899
  if (isCountFiler || isTotalFiler) {
1501
- const businessList = [];
1502
1900
  let children = target.children || [];
1503
1901
  for (let i = 0; i < children.length; i++) {
1504
1902
  const item = target.children[i];
1505
1903
  count =
1506
- isCountFiler && !tree.hiddenNodeKeySet.has(item.key) && countFilter
1904
+ isCountFiler && isStatistics(item.key) && countFilter
1507
1905
  ? count + (item.children ? item.count : countFilter(item.data))
1508
1906
  : count;
1509
1907
  total =
1510
- isTotalFiler && !tree.hiddenNodeKeySet.has(item.key) && totalFilter
1908
+ isTotalFiler && isStatistics(item.key) && totalFilter
1511
1909
  ? total + (item.children ? item.total : totalFilter(item.data))
1512
1910
  : total;
1513
1911
  if (item.data.deviceStatus === 0) {
@@ -1516,17 +1914,7 @@ function updateDeviceTree(tree, data, config) {
1516
1914
  else {
1517
1915
  deviceList[0].push(item);
1518
1916
  }
1519
- // 更新下级设备列表
1520
- if (integratedBusiness && !tree.hiddenNodeKeySet.has(item.key)) {
1521
- if (/^(1|4)$/.test(item.data.dataType)) {
1522
- businessList.push(...(item.data.childrenDeviceList || []));
1523
- }
1524
- else {
1525
- businessList.push(item.data);
1526
- }
1527
- }
1528
1917
  }
1529
- target.data.childrenDeviceList = businessList;
1530
1918
  }
1531
1919
  // 在仅显示设备时,设置 部门/群组 显示状态
1532
1920
  if (showOnlineState && count > 0) {
@@ -1573,6 +1961,130 @@ function updateDeviceTree(tree, data, config) {
1573
1961
  updateParnetCount(parentKeySet);
1574
1962
  return { tree, beOnlineList, beOfflineList };
1575
1963
  }
1964
+ // 设备通道树
1965
+ function updateDeviceChannelTree(tree, data, config) {
1966
+ const deviceMap = tree.deviceMap || new Map();
1967
+ const channelMap = tree.channelMap || new Map();
1968
+ let beOnlineList = [], beOfflineList = [];
1969
+ const { businessConfig, hiddenNodeKeySet } = config;
1970
+ const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
1971
+ const { sortByStatus, showOnlineState } = businessConfig;
1972
+ // 是否参与统计
1973
+ const isStatistics = (key) => {
1974
+ return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
1975
+ };
1976
+ // 更新父节点统计
1977
+ const updateParnetCount = (map) => {
1978
+ const isCountFiler = countFilter && isFunction(countFilter);
1979
+ const isTotalFiler = totalFilter && isFunction(totalFilter);
1980
+ const parentMap = new Map();
1981
+ for (const [, target] of map) {
1982
+ if (!target)
1983
+ continue;
1984
+ let count = isCountFiler ? 0 : target.data.count;
1985
+ let total = isTotalFiler ? 0 : target.data.total;
1986
+ const deviceList = [[], []];
1987
+ if (isCountFiler || isTotalFiler) {
1988
+ let children = target.children || [];
1989
+ for (const item of children) {
1990
+ if (target.data.dataType !== DataType.DEVICE) {
1991
+ count =
1992
+ isCountFiler && isStatistics(item.key) && countFilter
1993
+ ? count + (item.data.dataType !== DataType.DEVICE ? item.count : countFilter(item.data))
1994
+ : count;
1995
+ total =
1996
+ isTotalFiler && isStatistics(item.key) && totalFilter
1997
+ ? total + (item.data.dataType !== DataType.DEVICE ? item.total : totalFilter(item.data))
1998
+ : total;
1999
+ }
2000
+ else {
2001
+ count += item.data.deviceStatus === DeviceStatus.OFF_LINE ? 0 : 1;
2002
+ total++;
2003
+ }
2004
+ if (item.data.deviceStatus === DeviceStatus.OFF_LINE) {
2005
+ deviceList[sortByStatus ? 1 : 0].push(item);
2006
+ }
2007
+ else {
2008
+ deviceList[0].push(item);
2009
+ }
2010
+ }
2011
+ }
2012
+ // 在仅显示设备时,设置 部门/群组 显示状态
2013
+ if (showOnlineState && count > 0 && target.data.dataType !== DataType.DEVICE) {
2014
+ tree.hiddenNodeKeySet.delete(target.key);
2015
+ }
2016
+ // target.count = target.data.dataType === DataType.DEVICE ? deviceList[0].length : count
2017
+ // target.total = showOnlineState && target.data.dataType === DataType.DEVICE ? target.count : total
2018
+ target.count = count;
2019
+ target.total = total;
2020
+ target.parent && parentMap.set(target.parent.key, target.parent);
2021
+ target.children = [...deviceList[0], ...deviceList[1]];
2022
+ }
2023
+ parentMap.size && updateParnetCount(parentMap);
2024
+ };
2025
+ const parentMap = new Map();
2026
+ data.forEach((v) => {
2027
+ // 通道
2028
+ if (v.channelId) {
2029
+ const channel = channelMap.get(v.channelId);
2030
+ if (!channel)
2031
+ return;
2032
+ Object.assign(channel, {
2033
+ data: {
2034
+ ...channel.data,
2035
+ onlyId: channel.onlyId,
2036
+ dataType: channel.data.dataType,
2037
+ deviceStatus: setDeviceStatus(v) // 设备状态
2038
+ }
2039
+ });
2040
+ // 在仅显示设备时,切换显隐状态
2041
+ if (showOnlineState) {
2042
+ if (channel.data.deviceStatus === DeviceStatus.OFF_LINE) {
2043
+ tree.hiddenNodeKeySet.add(channel.key);
2044
+ beOfflineList.push(channel);
2045
+ }
2046
+ else {
2047
+ tree.hiddenNodeKeySet.delete(channel.key);
2048
+ beOnlineList.push(channel);
2049
+ }
2050
+ }
2051
+ channel.parent && parentMap.set(channel.parent.key, channel.parent);
2052
+ }
2053
+ // 设备
2054
+ else {
2055
+ const deviceList = deviceMap.get(v.deviceId);
2056
+ if (!deviceList?.length)
2057
+ return;
2058
+ deviceList.forEach((device) => {
2059
+ const target = tree.treeNodeMap.get(device.key);
2060
+ if (!target)
2061
+ return;
2062
+ Object.assign(target, {
2063
+ data: Object.assign(target.data, {
2064
+ ...v,
2065
+ onlyId: target.key,
2066
+ dataType: target.data.dataType,
2067
+ deviceStatus: setDeviceStatus(v) // 设备状态
2068
+ })
2069
+ });
2070
+ // 在仅显示设备时,切换显隐状态
2071
+ if (showOnlineState) {
2072
+ if (target.data.deviceStatus === DeviceStatus.OFF_LINE) {
2073
+ tree.hiddenNodeKeySet.add(target.key);
2074
+ beOfflineList.push(target);
2075
+ }
2076
+ else {
2077
+ tree.hiddenNodeKeySet.delete(target.key);
2078
+ beOnlineList.push(target);
2079
+ }
2080
+ }
2081
+ target.parent && parentMap.set(target.parent.key, target.parent);
2082
+ });
2083
+ }
2084
+ });
2085
+ updateParnetCount(parentMap);
2086
+ return { tree, beOnlineList, beOfflineList };
2087
+ }
1576
2088
  // 用户树
1577
2089
  function updateUserTree(tree, data, config) {
1578
2090
  const userMap = tree.userMap || new Map();
@@ -1625,13 +2137,15 @@ function updateCsTree(tree, data, config) {
1625
2137
  }
1626
2138
  const updateTreeMap = {
1627
2139
  // 设备树
1628
- device: updateDeviceTree,
2140
+ [Business.DEVICE]: updateDeviceTree,
2141
+ // 设备通道树
2142
+ [Business.CHANNEL]: updateDeviceChannelTree,
1629
2143
  // 群组设备树
1630
- groupDevice: updateDeviceTree,
2144
+ [Business.GROUP_DEVICE]: updateDeviceTree,
1631
2145
  // 用户树
1632
- user: updateUserTree,
2146
+ [Business.USER]: updateUserTree,
1633
2147
  // 采集站
1634
- cs: updateCsTree
2148
+ [Business.CS]: updateCsTree
1635
2149
  };
1636
2150
 
1637
2151
  /** 是否显示统计 */
@@ -1652,15 +2166,22 @@ function getContainer(config) {
1652
2166
  if (isElement(container)) {
1653
2167
  el = container;
1654
2168
  }
1655
- if (el && bgColor) {
1656
- el.style.backgroundColor = bgColor;
2169
+ if (!el)
2170
+ return el;
2171
+ if (bgColor) {
2172
+ el.style.setProperty('background-color', bgColor);
1657
2173
  }
1658
- if (el && fontSize) {
1659
- el.style.fontSize = `${fontSize}px`;
2174
+ if (fontSize) {
2175
+ el.style.setProperty('font-size', `${fontSize}px`);
1660
2176
  }
1661
- if (el && color) {
1662
- el.style.color = color;
2177
+ if (color) {
2178
+ el.style.setProperty('color', color);
1663
2179
  }
2180
+ el.classList.add('hy-tree');
2181
+ el.style.setProperty('--hy-tree-item-height', `${config.itemHeight}px`);
2182
+ el.style.setProperty('--hy-tree-item-gap', `${config.itemGap}px`);
2183
+ el.style.setProperty('--hy-tree-channel-bg-color', `${config.channelBgColor}`);
2184
+ el.style.setProperty('--hy-color-placeholder', `${config.placeholderColor}`);
1664
2185
  return el;
1665
2186
  }
1666
2187
  class VirtualTree {
@@ -1715,7 +2236,6 @@ class VirtualTree {
1715
2236
  if (!this._el) {
1716
2237
  throw Error('【container参数错误】:请传入id或者class或者元素节点');
1717
2238
  }
1718
- this._el.classList.add('hy-tree');
1719
2239
  this._handleMethod = config.handleMethod;
1720
2240
  this._filterMethod = config.filterMethod;
1721
2241
  this._onNodeExpand = config.onNodeExpand;
@@ -1954,7 +2474,9 @@ class VirtualTree {
1954
2474
  return;
1955
2475
  this._tree = await this._createTree(config.data);
1956
2476
  this._flattenTree = this._genereateFlattenTree();
1957
- const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, getCheckedKeys, getCheckedNodes,
2477
+ const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked,
2478
+ // afterNodeCheck,
2479
+ getCheckedKeys, getCheckedNodes,
1958
2480
  // getHalfCheckedKeys,
1959
2481
  // getHalfCheckedNodes,
1960
2482
  setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
@@ -1988,13 +2510,20 @@ class VirtualTree {
1988
2510
  const generateExpandIcon = (item) => {
1989
2511
  const el = document.createElement('div');
1990
2512
  el.classList.add('hy-tree-node__expand');
2513
+ // 通道数据
2514
+ if (item.data.dataType === 9)
2515
+ return el;
2516
+ // 其他数据
1991
2517
  if (this._expandedKeySet.has(item.key)) {
1992
2518
  el.classList.add('expanded');
1993
2519
  }
1994
2520
  const icon = document.createElement('div');
1995
2521
  icon.classList.add('hy-tree-node__expand-icon');
1996
2522
  el.appendChild(icon);
1997
- if (item.isLeaf || this._hiddenExpandIconKeySet.has(item.key)) {
2523
+ const isHideIcon = config.business !== Business.CHANNEL || item.data.dataType !== DataType.DEVICE
2524
+ ? item.isLeaf
2525
+ : this._businessConfig?.showOnlineState ? !item.count : !item.total;
2526
+ if (isHideIcon || this._hiddenExpandIconKeySet.has(item.key)) {
1998
2527
  el.style.setProperty('visibility', 'hidden');
1999
2528
  }
2000
2529
  else {
@@ -2077,35 +2606,10 @@ class VirtualTree {
2077
2606
  className = className.filter(Boolean);
2078
2607
  el.classList.add(...className);
2079
2608
  };
2080
- /** 渲染项 */
2081
- const generateItem = (item) => {
2082
- const { type, showSelect } = config.rowSelection;
2083
- let el = document.createElement('div');
2084
- el.classList.add('hy-tree-node');
2085
- if (config.itemGap) {
2086
- el.style.paddingBottom = `${config.itemGap}px`;
2087
- }
2088
- let nodeContainer = document.createElement('div');
2089
- nodeContainer.style.height = `${config.itemHeight}px`;
2090
- if (config.nodeBgColor) {
2091
- nodeContainer.style.backgroundColor = config.nodeBgColor;
2092
- }
2093
- setNodeClass(nodeContainer, item);
2094
- let content = document.createElement('div');
2095
- content.classList.add('hy-tree-node-content');
2096
- content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
2097
- // 设备离线 - 字体颜色
2098
- if (['device', 'groupDevice'].includes(config.business)
2099
- && this._props.showStatus
2100
- && item.data.dataType === 3
2101
- && item.data.deviceStatus === 0) {
2102
- content.style.color = config.placeholderColor;
2103
- }
2104
- content.appendChild(generateExpandIcon(item));
2105
- // 多选框/单选框
2106
- if ((isBoolean(showSelect)
2107
- ? showSelect
2108
- : isFunction(showSelect) && showSelect(item.data, item)) && config.rowSelection.showSelectBox) {
2609
+ /** 生成选中节点 */
2610
+ const generateCheckbox = (el, item) => {
2611
+ const { type } = config.rowSelection;
2612
+ if (isShowSelect(config, item) && config.rowSelection.showSelectBox) {
2109
2613
  if (type === 'checkbox') {
2110
2614
  new Checkbox({
2111
2615
  checked: isChecked(item),
@@ -2121,7 +2625,7 @@ class VirtualTree {
2121
2625
  }
2122
2626
  this.refresh();
2123
2627
  }
2124
- }).mount(content);
2628
+ }).mount(el);
2125
2629
  }
2126
2630
  else if (type === 'radio') {
2127
2631
  new Radio({
@@ -2132,9 +2636,36 @@ class VirtualTree {
2132
2636
  toggleCheckbox(item, checked, true, false);
2133
2637
  this.refresh();
2134
2638
  }
2135
- }).mount(content);
2639
+ }).mount(el);
2136
2640
  }
2137
2641
  }
2642
+ };
2643
+ /** 渲染项 */
2644
+ const generateItem = (item) => {
2645
+ let el = document.createElement('div');
2646
+ el.classList.add('hy-tree-node');
2647
+ if (item.data.dataType === 9) {
2648
+ el.classList.add('hy-tree-channel-node');
2649
+ }
2650
+ let nodeContainer = document.createElement('div');
2651
+ nodeContainer.style.height = `${config.itemHeight}px`;
2652
+ if (config.nodeBgColor) {
2653
+ nodeContainer.style.backgroundColor = config.nodeBgColor;
2654
+ }
2655
+ setNodeClass(nodeContainer, item);
2656
+ let content = document.createElement('div');
2657
+ content.classList.add('hy-tree-node-content');
2658
+ content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
2659
+ // 设备离线 - 字体颜色
2660
+ if ([Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)
2661
+ && this._props.showStatus
2662
+ && /^(3|9)$/.test(item.data.dataType)
2663
+ && item.data.deviceStatus === 0) {
2664
+ content.style.color = config.placeholderColor;
2665
+ }
2666
+ content.appendChild(generateExpandIcon(item));
2667
+ // 多选框/单选框
2668
+ generateCheckbox(content, item);
2138
2669
  // 整个节点内容
2139
2670
  this._customRender(config.renderItem, item, {
2140
2671
  inset: true,
@@ -2161,9 +2692,7 @@ class VirtualTree {
2161
2692
  if (config.onNodeClick) {
2162
2693
  await config.onNodeClick(item.data, item, e);
2163
2694
  }
2164
- if (!getDisabled(config, item) && (isBoolean(showSelect)
2165
- ? showSelect
2166
- : isFunction(showSelect) && showSelect(item.data, item))) {
2695
+ if (!getDisabled(config, item) && isShowSelect(config, item)) {
2167
2696
  if (config.checkOnClickNode) {
2168
2697
  toggleCheckbox(item, !(isChecked(item) || isIndeterminate(item)), true, true);
2169
2698
  if (!config.expandOnClickNode || item.isLeaf) {
@@ -2230,9 +2759,7 @@ class VirtualTree {
2230
2759
  if (getDisabled(config, item) ||
2231
2760
  item.isLeaf ||
2232
2761
  !config.checkOnDblclickParentNode ||
2233
- !(isBoolean(showSelect)
2234
- ? showSelect
2235
- : isFunction(showSelect) && showSelect(item.data, item))) {
2762
+ !isShowSelect(config, item)) {
2236
2763
  return;
2237
2764
  }
2238
2765
  nodeClickCount = 0;
@@ -2331,7 +2858,8 @@ class VirtualTree {
2331
2858
  count: this._props.count,
2332
2859
  total: this._props.total
2333
2860
  },
2334
- businessConfig: this._businessConfig
2861
+ businessConfig: this._businessConfig,
2862
+ hiddenNodeKeySet: this._hiddenNodeKeySet
2335
2863
  });
2336
2864
  Object.assign(this._tree, tree);
2337
2865
  // 设备离线时取消勾选状态
@@ -2450,6 +2978,77 @@ class VirtualTree {
2450
2978
  : data;
2451
2979
  return this._tree ? this._tree.treeNodeMap.get(key) : undefined;
2452
2980
  };
2981
+ /** 获取设备/群组下的全部设备 */
2982
+ getDeviceIntegrated = (() => {
2983
+ const getAllDevice = (children, params, list = []) => {
2984
+ if (!children?.length)
2985
+ return list;
2986
+ const { isOnlineState = false, isFilter = false } = params;
2987
+ for (const node of children) {
2988
+ const { dataType } = node.data;
2989
+ // 过滤设备
2990
+ if (isFilter && this._hiddenNodeKeySet.has(node.key)) {
2991
+ continue;
2992
+ }
2993
+ // 筛选在线设备
2994
+ if (isOnlineState &&
2995
+ ((!/^(1|4)$/.test(dataType) && node.data.onlineState !== 1) ||
2996
+ (/^(1|4)$/.test(dataType) && !node.count))) {
2997
+ continue;
2998
+ }
2999
+ // 部门、群组
3000
+ if (/^(1|4)$/.test(dataType)) {
3001
+ getAllDevice(node?.children || [], params, list);
3002
+ continue;
3003
+ }
3004
+ // 通道
3005
+ if (dataType === 9) {
3006
+ list.push({
3007
+ ...node.parent.data,
3008
+ ...node.data,
3009
+ });
3010
+ continue;
3011
+ }
3012
+ // 设备
3013
+ if (dataType === 3) {
3014
+ if (node.count) {
3015
+ getAllDevice(node?.children || [], params, list);
3016
+ }
3017
+ else {
3018
+ list.push(node.data);
3019
+ }
3020
+ continue;
3021
+ }
3022
+ // 其他类型
3023
+ list.push(node.data);
3024
+ }
3025
+ return list;
3026
+ };
3027
+ return (params) => {
3028
+ const { id, isBusiness = false } = params;
3029
+ if (!id)
3030
+ return;
3031
+ let node;
3032
+ if (isBusiness && this._business) {
3033
+ switch (this._business) {
3034
+ case Business.DEVICE:
3035
+ case Business.CHANNEL:
3036
+ case Business.GROUP_DEVICE:
3037
+ node = (this._tree.deviceMap && this._tree.deviceMap.get(id)) || [];
3038
+ break;
3039
+ case Business.USER:
3040
+ node = (this._tree.userMap && this._tree.userMap.get(id)) || [];
3041
+ break;
3042
+ case Business.CS:
3043
+ node = (this._tree.csMap && this._tree.csMap.get(id)) || [];
3044
+ break;
3045
+ }
3046
+ node = node?.[0];
3047
+ }
3048
+ node = node || this._tree.treeNodeMap.get(params.id);
3049
+ return getAllDevice(node?.children || [], params);
3050
+ };
3051
+ })();
2453
3052
  /** 设置展开的节点 */
2454
3053
  setExpandedKeys = (keys) => {
2455
3054
  const expandedKeys = new Set();
@@ -2530,4 +3129,4 @@ class VirtualTree {
2530
3129
  };
2531
3130
  }
2532
3131
 
2533
- export { VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };
3132
+ export { Business, DataType, DeviceStatus, VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };