<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2018-04-25 08:46:45 -->
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd">
	<NamespaceUris>
		<Uri>http://www.atvise.com/atServer/UA/</Uri>
	</NamespaceUris>
	<Aliases>
		<!-- data types -->
		<Alias Alias="Boolean">i=1</Alias>
		<Alias Alias="SByte">i=2</Alias>
		<Alias Alias="Byte">i=3</Alias>
		<Alias Alias="Int16">i=4</Alias>
		<Alias Alias="UInt16">i=5</Alias>
		<Alias Alias="Int32">i=6</Alias>
		<Alias Alias="UInt32">i=7</Alias>
		<Alias Alias="Int64">i=8</Alias>
		<Alias Alias="UInt64">i=9</Alias>
		<Alias Alias="Float">i=10</Alias>
		<Alias Alias="Double">i=11</Alias>
		<Alias Alias="String">i=12</Alias>
		<Alias Alias="DateTime">i=13</Alias>
		<Alias Alias="ByteString">i=15</Alias>
		<Alias Alias="XmlElement">i=16</Alias>
		<Alias Alias="NodeId">i=17</Alias>
		<Alias Alias="LocalizedText">i=21</Alias>
		<!-- references -->
		<Alias Alias="Organizes">i=35</Alias>
		<Alias Alias="HasEventSource">i=36</Alias>
		<Alias Alias="HasModellingRule">i=37</Alias>
		<Alias Alias="HasTypeDefinition">i=40</Alias>
		<Alias Alias="HasSubtype">i=45</Alias>
		<Alias Alias="HasProperty">i=46</Alias>
		<Alias Alias="HasComponent">i=47</Alias>
		<Alias Alias="HasNotifier">i=48</Alias>
		<!-- types -->
		<Alias Alias="BaseDataType">i=24</Alias>
		<Alias Alias="BaseObjectType">i=58</Alias>
		<Alias Alias="FolderType">i=61</Alias>
		<Alias Alias="BaseVariableType">i=62</Alias>
		<Alias Alias="PropertyType">i=68</Alias>
		<!-- modelling rules -->
		<Alias Alias="New">i=78</Alias>
		<Alias Alias="Shared">i=79</Alias>
	</Aliases>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/CompressedNode.html" ExportedBrowseName="1:CompressedNode.html" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/CompressedNode.html" BrowseName="1:CompressedNode.html" DataType="ByteString" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">CompressedNode.html</DisplayName>
		<Description Locale="en">CompressedNode.html</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Html</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Html.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWw+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KCTxoZWFkPgoJCTx0aXRsZT5hdHZpc2UgLSBuZXh0IGdlbmVyYXRpb248L3RpdGxlPgoJCTxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgoJCTxtZXRhIG5hbWU9InZpZXdwb3J0IiBpZD0idmlld3BvcnQtbWV0YSIgY29udGVudD0idXNlci1zY2FsYWJsZT15ZXMiIC8+CgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSB7Cglib3JkZXI6IDA7CgltYXJnaW46IDA7CgloZWlnaHQ6MTAwJTsKCXdpZHRoOjEwMCU7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cn0KaHRtbCxib2R5IHsKCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CgktbW96LXVzZXItc2VsZWN0OiBub25lOwoJLW1zLXVzZXItc2VsZWN0OiBub25lOwoJdXNlci1zZWxlY3Q6IG5vbmU7Cn0KI2Vycm9yc2NyZWVuLCAjbG9hZGluZ3NjcmVlbiB7Cglmb250LWZhbWlseTogQXJpYWw7CgloZWlnaHQ6IGluaGVyaXQ7CglsZWZ0OiAwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCXdpZHRoOiBpbmhlcml0OwoJei1pbmRleDogOTk5Owp9CgojZXJyb3JzY3JlZW4gewoJZGlzcGxheTogbm9uZTsKfQoKI2Vycm9ybWVzc2FnZSB7CglsZWZ0OiA1MCU7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDUwJTsKfQoKI2Vycm9ybWVzc2FnZSA+IGRpdiB7Cglmb250LXNpemU6IDEuM2VtOwoJY29sb3I6ICNmMjVlMDA7CgloZWlnaHQ6IDk4cHg7CglsZWZ0OiAtMjYycHg7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cgl0b3A6IC00OXB4OwoJd2lkdGg6IDUyNHB4OwoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZ3dBQUFCaUNBTUFBQUFMT1hzK0FBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFBRnpVa2RDQUs3T0hPa0FBQUF3VUV4VVJmLy8vd0FBQVA3Ky92Ly8vL050R1AvLy8vLy8vL2luZFAvLy8vLy8vL3JIcC9hTVNmM2d6djd3NlBKZUFQLy8vd001WjdvQUFBQU9kRkpPVTk0QTQ5TDZueDM0YlVQeSt2THN2MjFsYWdBQUJNUkpSRUZVZU5ydG5kbWEyakFNUmpOMk5naEozLzl0Q3lFTHhFdThXOFMvdnEvVG03bG96YW1zTTVMYzZzOHhtdWV2VzRXNFZEaXkwTFArUlFUT0R6RDh0Wnp4OXZVYkRoQXc5SXpOcWFISEFSWVBRMXM5WWFpZXFlRVBxYUY0R0JyMkN0U1FnT0ZKQUh2SERUVWtZT0FMREh5K01ZZ0dMckFrTVBSc2pWMHZPYlV2RmMwL0Z1RXZUakMwZklNQmVsbDZabWpZSGczMHNtZ1kyZzhXb0plRnc3QWtobzVCTDR1SFlkSEsrM1NIWGhZUHc3dDZyT3FwcnVqcUpZZGJwb0JoMGNwdW1xWnUxOHVlbU1wVmtFdW5ZM1BTeW5GNnhialZrTkRMRWpQRFVqME9Nd3dEOUxKa0dKYnE4VEc5NDZPR1JHb29Eb2F2eERCTk5mU3lYQmcyclp5K1V3TW00QXFFWWFrZTZ3MkdldHoxa3RCRndhR1gwV0g0ME1vMUJMMGtwWld3Uzh1RHM1eDEyNnZIZHp6UW9pZ3lNeHlxeCttb2w2Z2h5NEZCcUI0RnZVUU5XUXdNUzJLb0R6RFUrd1FjaWRTQXl5b0JETDA4TVh6VmtFZ05aY0RRQ2xwNTFFdEtMUXE0WlZRWUpGcDVTQTBORGIyRVhGYXh1NVpTcllSZWxwa1pwRm9KdlN3U2hwdXFlb1JlbGdjRGwydWxSQy96VDhEaHBvb0xnNlo2aEY0V0JvT2dsZi9XMkdpQVhwWUNRM05NRENJTUF4VzloRjNHN1ZxMjdLaVZLd3NqOUxLMHpDQnE1U2pDUUVvdmdXTXNHQ1JhK1JCaG9LS1g0Q0FxRE5zS2xRakQ1dzhrS1M5WUlRTEJJTk5LR1F6U0JTdkVwV0Q0V3FIYXJnUVpETlFXcktDV3dXR1FOaVZXR082cUZrV2ZUZWNnbHo2SFo3VkNwWVVCQzFZWHp3enlibVVuaDRITWdoVlFqQUdEb2x1NXd0REp1NWM1V3hUZ0lCb01pbGszRlF4RUY2d1FJV0JRZFN0Vk1GRFZTNERwRDROeTFtMVF3VUNxUlFHdERBbURjdFp0aFdFNG40QWpJNVp3UjRQVGM1bDFVOE9BQ2JpTFpnYjFyRnV0aGlIdmdoVkhpUkFIaGw0OUJMdkNVR01Dcmd3WTFDdFVlaGdvTGxnaFBHSFFEc0ZxWUJBWHJBajRKS2owZ3FGbG1oV3E2VGdDU1ZzdkVaNHdhRmVvOURCSUp1Qkl1Q1hrMFZFdFQxYW9SaDBNV2ZXU0kwa0V6d3lTV1RjUmhsRzFZSlY3QWc2ZmUwZ1l6bGFvSHBKQkoramxOV0hRYWFVSkRNUW00SkFvZkdCb3puWXJ6MkNnOE1RNEVBZ0NnMTRyOTdtM3Uvb2JzdWdsQnhIaFlkQnJwUkVNV2JxWEVFdmYwN1BXU2lNWU11b2x4NlVSTURPY2FPV3NDNDlYZEpydndJTFZKV0E0ZlpuRExQSk93Q0VSQklGQnVrTGxFZy84RDFZL0Q4TjU5V2dZK2ZXU0kwMzR3WEE3MVVyalNGeEQ0aVAzUHp1ejU4SmRRcnBnRlZzczhaYVBqNVJiYTZWMWFxRFJva0Rpc0w0bXpwb1NkcWtoMTRJVkJ3TUJZRERVU3ZVU3pVOHNXQ0ZNWU5BK0YrNEFRODRKT0tRRVR4aE10ZElZQmp3eC9scys0Vkk5R3NNZzZDV1ArN2ZoU0JOZU9kVDh1WEFYR0tRTFZubGFscERJODFNeldxRnloaUhEQkJ4SFNuQXVyTXhuM1p4Z3dJTFZUeGFRRnQxS0N4aklMRmdoTEdBdzFjcjVuM3YzanNHdWU1bE9MNUdEL0dBSTFxMGtvNWZjeERNUW4yY1ZveW1Sdm51SkR6eElGaldmZFhOdVVVZ200REtJSmZ6U1ZDMER6YnJSWHJCQzVqQ3FHWUxOdXVrV3JCTHBKVDV5VHhpaVZZK1pKK0FBaGowTWJiaFpONjFlSm54aUhCaTRIRk9DeEpDNWV3a3VqRS9vUXl2cmVCRmZMMC9NQWtRWVhoTkx0ekpCN0hxWnlTMmhrOXBEMjdReVNXQUNqblptYUhsQ0dGSXNXSEZjRGM0d05DeGxvSHRKMlNkdUxHM2dpWEhDMGZDME1lc2xSMUNNLzAzVStXLzMyZ0pNQUFBQUFFbEZUa1N1UW1DQyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9CgojZXJyb3JtZXNzYWdlIGE6bGluaywgYTp2aXNpdGVkLCBhOmFjdGl2ZSwgYTpob3ZlciB7Cgljb2xvcjogI2YyNWUwMDsKfQoKI2Vycm9ybWVzc2FnZSBkaXYgZGl2IHsKCXBhZGRpbmctbGVmdDogOTBweDsKCW1hcmdpbi10b3A6IDIwcHg7CglsaW5lLWhlaWdodDogMzBweDsKfQoKI2Vycm9ybWVzc2FnZSBzcGFuIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKI2Vycm9yb3ZlcmxheSB7CgliYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKCWZpbHRlcjogYWxwaGEob3BhY2l0eT03MCk7CgloZWlnaHQ6IDEwMCU7CglsZWZ0OiAwOwoJb3BhY2l0eTogMC43OwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAwOwoJd2lkdGg6IDEwMCU7Cn0KCiNsb2FkaW5nc2NyZWVuIHsKCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7CgljdXJzb3I6IHdhaXQ7Cn0KCi5tYWluQ29udGFpbmVyRGVmYXVsdFN0eWxlIHsKCWhlaWdodDogaW5oZXJpdDsKCXdpZHRoOiBpbmhlcml0OwoJcG9zaXRpb246IGFic29sdXRlOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXRyYW5zZm9ybS1vcmlnaW46IDAgMCAwOwp9CgkJPC9zdHlsZT4KCQk8c2NyaXB0IHNyYz0id2VibWljZmcuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8qPCFbQ0RBVEFbKi8KdmFyIGRvY0RvbWFpbj10cnVlOwp2YXIgZGlzcGxheXR5cGU9InhodG1sIjsKaWYgKCJ3ZWJNSUNvbmZpZyIgaW4gd2luZG93KSB7Cgl2YXIgY29uZmlnID0gd2luZG93WyJ3ZWJNSUNvbmZpZyJdOwoJaWYoImZyYW1lLmRvY3VtZW50ZG9tYWluIiBpbiBjb25maWcpCgkJZG9jRG9tYWluPWNvbmZpZ1siZnJhbWUuZG9jdW1lbnRkb21haW4iXTsKCWlmKCJmcmFtZS5kaXNwbGF5dHlwZSIgaW4gY29uZmlnKQoJCWRpc3BsYXl0eXBlPWNvbmZpZ1siZnJhbWUuZGlzcGxheXR5cGUiXTsKfQppZihkaXNwbGF5dHlwZSAhPSAieGh0bWwiICYmIGRpc3BsYXl0eXBlICE9ICJzdmciKSB7CglkaXNwbGF5dHlwZT0ieGh0bWwiCn0KaWYoZG9jRG9tYWluID09IHRydWUpIHsKCXRyeSB7CgkJaWYgKGRpc3BsYXl0eXBlID09ICJzdmciICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID4gLTEpCgkJCXRocm93IGZhbHNlOwoKCQl2YXIgZG9tYWluID0gbG9jYXRpb25bImhvc3RuYW1lIl0KCQkJCS5zcGxpdCgiLiIpCgkJCQkuc2xpY2UoLTIpOwoKCQlkb2N1bWVudC5kb21haW4gPSBkb21haW4uam9pbigiLiIpOwoJfSBjYXRjaCAoZSkge30KfQovKl1dPiovPC9zY3JpcHQ+CgkJPHNjcmlwdCBzcmM9InByb2plY3QuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CgkJPHNjcmlwdCBzcmM9IndlYm1pLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vKjwhW0NEQVRBWyovCnZhciBjdXJyZW50T0Rpc3BsYXkgPSAiIjsKdmFyIHJvb3QKdmFyIGF1dG9maXQgPSB3ZWJNSS5xdWVyeS5hdXRvZml0Owp2YXIgc2NhbGVUeXBlID0gd2ViTUkuZ2V0Q29uZmlnKCJmcmFtZS5zY2FsZXR5cGUiKTsKdmFyIGRlZmF1bHRkaXNwbGF5ID0gd2ViTUkucXVlcnkuZGVmYXVsdGRpc3BsYXk7CnZhciBkZWZhdWx0dXJsID0gd2ViTUkucXVlcnkuZGVmYXVsdHVybDsKdmFyIGxhbmd1YWdlID0gd2ViTUkucXVlcnkubGFuZ3VhZ2U7CnZhciBpc1Jvb3REaXNwbGF5ID0gd2ViTUkuZGlzcGxheS5pc1Jvb3QoKTsKdmFyIGlzTW9iaWxlVG91Y2hEZXZpY2UgPSAvTW9iaWxlfGlQKGhvbmV8b2R8YWQpfEFuZHJvaWR8QmxhY2tCZXJyeXxJRU1vYmlsZXxLaW5kbGV8TmV0RnJvbnR8U2lsay1BY2NlbGVyYXRlZHwoaHB3fHdlYilPU3xGZW5uZWN8TWluaW1vfE9wZXJhIE0ob2JpfGluaSl8QmxhemVyfERvbGZpbnxEb2xwaGlufFNreWZpcmV8WnVuZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZGFsZXRoZWRldmVsb3Blci8xNTAzMjUyCgppZiAodHlwZW9mIGF1dG9maXQgPT09ICJ1bmRlZmluZWQiKQoJYXV0b2ZpdCA9ICFpc01vYmlsZVRvdWNoRGV2aWNlOwplbHNlCglhdXRvZml0ID0gYXV0b2ZpdCAhPSAiZmFsc2UiICYmIGF1dG9maXQgIT0gIjAiOwoKaWYgKGlzUm9vdERpc3BsYXkpIHsKCXZhciBiZXN0SW5kZXhFeHRlbnNpb24gPSAiIjsKCWZvciAodmFyIGkgaW4gcHJvamVjdC5leHRlbnNpb25zKSB7CgkJdmFyIGFyciA9IHByb2plY3QuZXh0ZW5zaW9uc1tpXTsKCQl3ZWJNSS5zZXRFeHRlbnNpb24oaSwgYXJyWzBdLCBhcnJbMV0pOwoKCQlpZiAoYmVzdEluZGV4RXh0ZW5zaW9uICE9ICJpbmRleCIgJiYgLyhefFwuKWluZGV4JC8udGVzdChpKSkKCQkJYmVzdEluZGV4RXh0ZW5zaW9uID0gaTsKCX0KCglpZiAoYmVzdEluZGV4RXh0ZW5zaW9uICE9ICIiKSB7CgkJdmFyIGFyciA9IHByb2plY3QuZXh0ZW5zaW9uc1tiZXN0SW5kZXhFeHRlbnNpb25dOwoJCXdlYk1JLnNldEV4dGVuc2lvbigiaW5kZXgiLCBhcnJbMF0sIGFyclsxXSk7Cgl9CgoJd2ViTUkuc2V0Q29uZmlnKCJmcmFtZS5lbmFibGVhdXRvZml0IiwgYXV0b2ZpdCk7Cn0KCmZ1bmN0aW9uIG5vZGVOYW1lSXMobm9kZSwgdmFsdWUpIHsKCWlmICghbm9kZSkKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJuIFN0cmluZyhub2RlLm5vZGVOYW1lKS50b0xvd2VyQ2FzZSgpID09IHZhbHVlOwp9CgpmdW5jdGlvbiBGb3JlaWduT2JqZWN0KGZyYW1lSGFuZGxlciwgZWxlbWVudCkgewoJdGhpcy5mcmFtZUhhbmRsZXJfID0gZnJhbWVIYW5kbGVyOwoJdGhpcy5lbGVtZW50XyA9IGVsZW1lbnQ7Cn0KCkZvcmVpZ25PYmplY3QucHJvdG90eXBlLmlzUmVzcG9uc2libGUgPSBmdW5jdGlvbihlbGVtZW50KSB7CglyZXR1cm4gdGhpcy5lbGVtZW50XyA9PSBlbGVtZW50Owp9CgpGb3JlaWduT2JqZWN0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7Cgl0aGlzLmVsZW1lbnRfLnN0eWxlLmxlZnQgPSB0aGlzLmxlZnRfICsgInB4IjsKCXRoaXMuZWxlbWVudF8uc3R5bGUudG9wID0gdGhpcy50b3BfICsgInB4IjsKCXRoaXMuZWxlbWVudF8uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoXyArICJweCI7Cgl0aGlzLmVsZW1lbnRfLnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0XyArICJweCI7CglpZihzY2FsZVR5cGUgPT0gIm5hdGl2ZSIpCgkJdGhpcy5lbGVtZW50Xy5zdHlsZS5mb250U2l6ZSA9IHRoaXMuZm9udEZhY3Rvcl8gKyAiZW0iOwp9CgpGb3JlaWduT2JqZWN0LnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgZm9udEZhY3RvcikgewoJaWYgKCF0aGlzLmlzUmVzcG9uc2libGUoZWxlbWVudCkpCgkJcmV0dXJuOwoKCXRoaXMubGVmdF8gPSBNYXRoLnJvdW5kKGxlZnQqMTApLzEwOwoJdGhpcy50b3BfID0gTWF0aC5yb3VuZCh0b3AqMTApLzEwOwoJdGhpcy53aWR0aF8gPSBNYXRoLnJvdW5kKHdpZHRoKjEwKS8xMDsKCXRoaXMuaGVpZ2h0XyA9IE1hdGgucm91bmQoaGVpZ2h0KjEwKS8xMDsKCXRoaXMuZm9udEZhY3Rvcl8gPSBmb250RmFjdG9yOwoKCXZhciBwYXJlbnRGcmFtZUhhbmRsZXIgPSB0aGlzLmZyYW1lSGFuZGxlcl8ucGFyZW50RnJhbWVIYW5kbGVyXzsKCWlmIChwYXJlbnRGcmFtZUhhbmRsZXIpCgkJdGhpcy5mb250RmFjdG9yXyAvPSBwYXJlbnRGcmFtZUhhbmRsZXIuZm9udEZhY3Rvcl87CgoJdGhpcy5zZXRBdHRyaWJ1dGVzKCk7Cn0KCmZ1bmN0aW9uIEZyYW1lSGFuZGxlcihlbGVtZW50LCBmb3JlaWduT2JqZWN0Q29udGFpbmVyLCBwYXJlbnRGcmFtZUhhbmRsZXIsIHBhcmVudEZvcmVpZ25PYmplY3QpIHsKCXZhciBzZWxmID0gdGhpczsKCXRoaXMuZWxlbWVudF8gPSBlbGVtZW50OwoJdGhpcy5mb3JlaWduT2JqZWN0Q29udGFpbmVyXyA9IGZvcmVpZ25PYmplY3RDb250YWluZXI7Cgl0aGlzLnBhcmVudEZyYW1lSGFuZGxlcl8gPSBwYXJlbnRGcmFtZUhhbmRsZXI7Cgl0aGlzLmZvcmVpZ25PYmplY3RzXyA9IFtdOwoJdGhpcy5mb250RmFjdG9yXyA9IDE7Cgl0aGlzLnN1YkZyYW1lc18gPSBbXTsKCXRoaXMucGFyZW50Rm9yZWlnbk9iamVjdF8gPSBwYXJlbnRGb3JlaWduT2JqZWN0OwoKCXdlYk1JLmRpc3BsYXkuc2V0Rm9yZWlnbk9iamVjdEhhbmRsZXIoZWxlbWVudCwgeyBjcmVhdGU6IGZ1bmN0aW9uKGNoaWxkRWxlbWVudHMpIHsKCQl2YXIgcmV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJcmV0LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKCQlyZXQuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCgkJc2VsZi5mb3JlaWduT2JqZWN0c18ucHVzaChuZXcgRm9yZWlnbk9iamVjdChzZWxmLCByZXQpKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkRWxlbWVudHMubGVuZ3RoOyArK2kpCgkJCXJldC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnRzW2ldKTsKCgkJcmV0dXJuIHJldDsKCX0sIGRlc3Ryb3k6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmZvcmVpZ25PYmplY3RzXy5sZW5ndGg7ICsraSkgewoJCQlpZiAoc2VsZi5mb3JlaWduT2JqZWN0c19baV0uaXNSZXNwb25zaWJsZShlbGVtZW50KSkgewoJCQkJc2VsZi5mb3JlaWduT2JqZWN0c18uc3BsaWNlKGksIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zdWJGcmFtZXNfLmxlbmd0aDsgKytpKSB7CgkJCXZhciBzdWJGcmFtZSA9IHNlbGYuc3ViRnJhbWVzX1tpXTsKCQkJaWYgKHN1YkZyYW1lLnBhcmVudEZvcmVpZ25PYmplY3RfID09IGVsZW1lbnQpIHsKCQkJCSRGcmFtZUhhbmRsZXIoc3ViRnJhbWUpOwoJCQkJc2VsZi5zdWJGcmFtZXNfLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZihzZWxmLmVsZW1lbnRfLnBhcmVudEVsZW1lbnQuaWQgPT0gInBvcHVwY29udGVudCIpewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucGFyZW50RnJhbWVIYW5kbGVyXy5zdWJGcmFtZXNfLmxlbmd0aDtpKyspewoJCQkJaWYoc2VsZi5wYXJlbnRGcmFtZUhhbmRsZXJfLnN1YkZyYW1lc19baV0gPT0gc2VsZil7CgkJCQkJc2VsZi5wYXJlbnRGcmFtZUhhbmRsZXJfLnN1YkZyYW1lc18uc3BsaWNlKGktLSwgMSk7CgkJCQkJJEZyYW1lSGFuZGxlcihzZWxmKTsKCQkJCX0KCQkJfQoJCX0KCgl9LCBzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgZm9udEZhY3RvcikgewoJCXNlbGYuZm9udEZhY3Rvcl8gPSBmb250RmFjdG9yOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5mb3JlaWduT2JqZWN0c18ubGVuZ3RoOyArK2kpCgkJCXNlbGYuZm9yZWlnbk9iamVjdHNfW2ldLnNldFBvc2l0aW9uKGVsZW1lbnQsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgZm9udEZhY3Rvcik7Cgl9LCBhZGQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKCQlzZWxmLmZvcmVpZ25PYmplY3RDb250YWluZXJfLmFwcGVuZENoaWxkKGVsZW1lbnQpOwoJCWhhbmRsZXIoImFkZGVkZm9yZWlnbm9iamVjdCIsIGVsZW1lbnQpOwoJfSwgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7CgkJaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PSBzZWxmLmZvcmVpZ25PYmplY3RDb250YWluZXJfKSB7CgkJCXNlbGYuZm9yZWlnbk9iamVjdENvbnRhaW5lcl8ucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CgkJCWhhbmRsZXIoInJlbW92ZWRmb3JlaWdub2JqZWN0IiwgZWxlbWVudCk7CgkJfQoJfSwgcmVnaXN0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGNoaWxkRWxlbWVudHMpIHsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKCQkJdmFyIGNoaWxkID0gY2hpbGRFbGVtZW50c1tpXTsKCQkJaWYgKG5vZGVOYW1lSXMoY2hpbGQsICJpZnJhbWUiKSkgewoJCQkJdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQkJCWNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJCQllbGVtZW50Lmluc2VydEJlZm9yZShjb250YWluZXIsIGNoaWxkKTsKCQkJCXNlbGYuc3ViRnJhbWVzXy5wdXNoKG5ldyBGcmFtZUhhbmRsZXIoY2hpbGQsIGNvbnRhaW5lciwgc2VsZiwgZWxlbWVudCkpOwoJCQl9CgkJfQoJfSwgYXBwbHlPZmZzZXRzVG9NYXRyaXg6IGZ1bmN0aW9uKG1hdHJpeCkgewoJCW1hdHJpeC5lICs9IHNlbGYub2Zmc2V0TGVmdCh0cnVlKTsKCQltYXRyaXguZiArPSBzZWxmLm9mZnNldFRvcCh0cnVlKTsKCQlyZXR1cm4gbWF0cml4OwoJfX0pOwoKCXdlYk1JLmRpc3BsYXkuc2V0T3BlbldpbmRvd0hhbmRsZXIoZWxlbWVudCwgZnVuY3Rpb24odmFsdWUpIHsKCQl2YXIgc2NhbGVGYWN0b3IgPSBzZWxmLmVsZW1lbnRfLmNvbnRlbnRXaW5kb3cud2ViTUkuZ2Z4LmdldEFic29sdXRlU2NhbGVGYWN0b3IoKTsKCQl2YXIgcmV0ID0gaGFuZGxlcigib3BlbndpbmRvdyIsIHZhbHVlLCBzZWxmLm9mZnNldExlZnQoKSwgc2VsZi5vZmZzZXRUb3AoKSwgc2VsZi5lbGVtZW50Xy5jbGllbnRXaWR0aCpzY2FsZUZhY3Rvciwgc2VsZi5lbGVtZW50Xy5jbGllbnRIZWlnaHQqc2NhbGVGYWN0b3IpOwoJCXZhciBmb3JlaWduT2JqZWN0Q29udGFpbmVyID0gc2VsZi5mb3JlaWduT2JqZWN0Q29udGFpbmVyXzsKCQlpZiAoImdldEZvcmVpZ25PYmplY3RDb250YWluZXIiIGluIHJldCkKCQkJZm9yZWlnbk9iamVjdENvbnRhaW5lciA9IHJldC5nZXRGb3JlaWduT2JqZWN0Q29udGFpbmVyKCk7CgkJaWYgKCJnZXRGcmFtZSIgaW4gcmV0KQoJCQlzZWxmLnN1YkZyYW1lc18ucHVzaChuZXcgRnJhbWVIYW5kbGVyKHJldC5nZXRGcmFtZSgpLCBmb3JlaWduT2JqZWN0Q29udGFpbmVyLCBzZWxmKSk7CgkJcmV0dXJuIHJldDsKCX0pOwoKCXdlYk1JLmRpc3BsYXkuc2V0U2hvd1BvcHVwSGFuZGxlcihlbGVtZW50LCBmdW5jdGlvbih4LCB5LCB2YWx1ZSkgewoJCXJldHVybiBoYW5kbGVyKCJzaG93cG9wdXAiLCB4ICsgc2VsZi5vZmZzZXRMZWZ0KCksIHkgKyBzZWxmLm9mZnNldFRvcCgpLCB2YWx1ZSk7Cgl9KTsKCn0KCmZ1bmN0aW9uICRGcmFtZUhhbmRsZXIoc2VsZikgewoJaWYgKHdlYk1JKSB7CgkJd2ViTUkuZGlzcGxheS5zZXRGb3JlaWduT2JqZWN0SGFuZGxlcihzZWxmLmVsZW1lbnRfLCBudWxsKTsKCQl3ZWJNSS5kaXNwbGF5LnNldE9wZW5XaW5kb3dIYW5kbGVyKHNlbGYuZWxlbWVudF8sIG51bGwpOwoJCXdlYk1JLmRpc3BsYXkuc2V0U2hvd1BvcHVwSGFuZGxlcihzZWxmLmVsZW1lbnRfLCBudWxsKTsKCX0KfQoKRnJhbWVIYW5kbGVyLnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgewoJdGhpcy53aWR0aF8gPSB3aWR0aDsKCXRoaXMuaGVpZ2h0XyA9IGhlaWdodDsKCgl0aGlzLmVsZW1lbnRfLnN0eWxlLndpZHRoID0gd2lkdGggKyAicHgiOwoJdGhpcy5lbGVtZW50Xy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwp9CgoKRnJhbWVIYW5kbGVyLnByb3RvdHlwZS5vZmZzZXRMZWZ0ID0gZnVuY3Rpb24odW50aWxCb2R5KSB7CglyZXR1cm4gd2ViTUkuZ2Z4LmdldEFic29sdXRlT2Zmc2V0KCJsZWZ0IiwgdW50aWxCb2R5LCB0aGlzLmVsZW1lbnRfKTsKfQoKRnJhbWVIYW5kbGVyLnByb3RvdHlwZS5vZmZzZXRUb3AgPSBmdW5jdGlvbih1bnRpbEJvZHkpIHsKCXJldHVybiB3ZWJNSS5nZnguZ2V0QWJzb2x1dGVPZmZzZXQoInRvcCIsIHVudGlsQm9keSwgdGhpcy5lbGVtZW50Xyk7Cn0KCnZhciBkaXNwbGF5c0pzOwp2YXIgbWFpbkZyYW1lSGFuZGxlcjsKdmFyIHJlbWFpbmluZ0xvYWRFdmVudHMgPSAyOwp2YXIgbG9hZEV2ZW50TGFuZ3VhZ2UgPSBudWxsOwp2YXIgaGFuZGxlciA9IHdlYk1JLmNhbGxFeHRlbnNpb24oImluZGV4Iik7CgpmdW5jdGlvbiBnZXREaXNwbGF5Q29kZShkaXNwbGF5TmFtZSwgdHJlZSl7Cgl0cmVlID09IHVuZGVmaW5lZCA/IHRyZWUgPSBkaXNwbGF5c0pzLm1lbnUgOiB0cmVlID0gdHJlZTsKCXZhciBkaXNwbGF5Q29kZTsKCWZvcih2YXIgaXRtIGluIHRyZWUpCgl7CgkJaWYodHJlZVtpdG1dLmlkZW50aWZpZXIgPT0gZGlzcGxheU5hbWUpCgkJCXJldHVybiB0cmVlW2l0bV0uZGlzcGxheTsKCQllbHNlIGlmKHRyZWVbaXRtXS5zdWIpCgkJewoJCQlkaXNwbGF5Q29kZSA9IGdldERpc3BsYXlDb2RlKGRpc3BsYXlOYW1lLCB0cmVlW2l0bV0uc3ViKTsKCQkJaWYoZGlzcGxheUNvZGUgIT0gdW5kZWZpbmVkKQoJCQkJIGJyZWFrOwoJCX0KCX0KCXJldHVybiBkaXNwbGF5Q29kZTsKfQoKZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoZGlzcGxheUNvZGUsIHRyZWUpewoJdHJlZSA9PSB1bmRlZmluZWQgPyB0cmVlID0gZGlzcGxheXNKcy5tZW51IDogdHJlZSA9IHRyZWUKCXZhciBkaXNwbGF5TmFtZTsKCWZvcih2YXIgaXRtIGluIHRyZWUpCgl7CgkJaWYodHJlZVtpdG1dLmRpc3BsYXkgPT0gZGlzcGxheUNvZGUpCgkJCXJldHVybiB0cmVlW2l0bV0uaWRlbnRpZmllcjsKCQllbHNlIGlmKHRyZWVbaXRtXS5zdWIpCgkJewoJCQlkaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lKGRpc3BsYXlDb2RlLCB0cmVlW2l0bV0uc3ViKTsKCQkJaWYoZGlzcGxheU5hbWUgIT0gdW5kZWZpbmVkKQoJCQkJIGJyZWFrOwoJCX0KCX0KCXJldHVybiBkaXNwbGF5TmFtZTsKfQoKZnVuY3Rpb24gbG9hZEV2ZW50KGxuZykgewoJdmFyIG1haW5mcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluZnJhbWUiKTsKCXZhciBmb3JlaWdub2JqZWN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb3JlaWdub2JqZWN0cyIpOwoJaWYgKCFtYWluRnJhbWVIYW5kbGVyICYmIG1haW5mcmFtZSkKCQltYWluRnJhbWVIYW5kbGVyID0gbmV3IEZyYW1lSGFuZGxlcihtYWluZnJhbWUsIGZvcmVpZ25vYmplY3RzKTsKCWlmICghbG9hZEV2ZW50TGFuZ3VhZ2UpCgkJbG9hZEV2ZW50TGFuZ3VhZ2UgPSBsbmc7CgoJaWYgKC0tcmVtYWluaW5nTG9hZEV2ZW50cyA+IDApCgkJcmV0dXJuOwoKCXZhciBhYnNvbHV0ZVByZWZpeCA9IGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cigwLCBsb2NhdGlvbi5wYXRobmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7Cgl3ZWJNSS5kaXNwbGF5LnNldFVSTFByZWZpeChhYnNvbHV0ZVByZWZpeCArIGRpc3BsYXlzSnNbInByZWZpeCJdKTsKCXdlYk1JLmRpc3BsYXkuc2V0VVJMUG9zdGZpeChkaXNwbGF5c0pzWyJwb3N0Zml4Il0pOwoKCWlmICghdGhpcy5pc1Jvb3REaXNwbGF5KXsKCQl2YXIgdXJsID0gZGVmYXVsdHVybDsKCQlpZih3ZWJNSS5pc0V4dGVybmFsSG9zdCh1cmwsIGxvY2F0aW9uKSAmJiBpc01vYmlsZVRvdWNoRGV2aWNlKXsKCQkJdmFyIG1haW5Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpbkNvbnRhaW5lciIpOwoJCQltYWluQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoIm1haW5Db250YWluZXJEZWZhdWx0U3R5bGUiKTsKCQl9Cgl9CgoJaWYgKHR5cGVvZiB1cmwgPT09ICJ1bmRlZmluZWQiKSB7CgkJaWYgKHR5cGVvZiBkZWZhdWx0ZGlzcGxheSAhPT0gInVuZGVmaW5lZCIpIHsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwbGF5c0pzLm1lbnUubGVuZ3RoOyArK2kpIHsKCQkJCWlmIChkaXNwbGF5c0pzLm1lbnVbaV0ubmFtZSA9PSBkZWZhdWx0ZGlzcGxheSkKCQkJCQl1cmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChkaXNwbGF5c0pzLm1lbnVbaV0uZGlzcGxheSwgd2ViTUkucXVlcnkpOwoJCQl9CgkJfQoJCWlmICh0eXBlb2YgdXJsID09PSAidW5kZWZpbmVkIikgewoJCQlpZiAoImRlZmF1bHQiIGluIGRpc3BsYXlzSnMpCgkJCQl1cmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChkaXNwbGF5c0pzWyJkZWZhdWx0Il0sIHdlYk1JLnF1ZXJ5KTsKCQkJZWxzZQoJCQkJdXJsID0gbG9hZEV2ZW50TGFuZ3VhZ2UgKyAiL2RlZmF1bHQuaHRtIjsKCQl9Cgl9CgoJaGFuZGxlcigibG9hZGVkIik7CglmdW5jdGlvbiByZXNwb25zaXZlSGFuZGxlcigpewoJCXZhciBzd2FwVXJsCgkJdHJ5IHsKCQkJaWYgKHNjcmVlbi5vcmllbnRhdGlvbi5hbmdsZSA9PSAwKSB7CgkJCQlpZiAoc2NyZWVuLndpZHRoID4gMTIwMCkgewoJCQkJCXN3YXBVcmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChnZXREaXNwbGF5Q29kZShyb290ICsgIi5ESVNQTEFZUy5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0gZWxzZSBpZiAoc2NyZWVuLndpZHRoIDwgNTAwKSB7CgkJCQkJc3dhcFVybCA9IHdlYk1JLmRpc3BsYXkuY3JlYXRlVVJMKGdldERpc3BsYXlDb2RlKHJvb3QgKyAiLkRJU1BMQVlTLk1PQklMRS5Qb3J0cmFpdC5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dhcFVybCA9IHdlYk1JLmRpc3BsYXkuY3JlYXRlVVJMKGdldERpc3BsYXlDb2RlKHJvb3QgKyAiLkRJU1BMQVlTLlRBQkxFVC5Qb3J0cmFpdC5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0KCQkJfSBlbHNlIGlmIChzY3JlZW4ub3JpZW50YXRpb24uYW5nbGUgPT0gOTAgfHwgc2NyZWVuLm9yaWVudGF0aW9uLmFuZ2xlID09IDI3MCkgewoJCQkJaWYgKHNjcmVlbi53aWR0aCA+IDE0MDApIHsKCQkJCQlzd2FwVXJsID0gd2ViTUkuZGlzcGxheS5jcmVhdGVVUkwoZ2V0RGlzcGxheUNvZGUocm9vdCArICIuRElTUExBWVMuRGVmYXVsdCIpLCB3ZWJNSS5xdWVyeSk7CgkJCQl9IGVsc2UgaWYgKHNjcmVlbi53aWR0aCA8IDg1MCkgewoJCQkJCXN3YXBVcmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChnZXREaXNwbGF5Q29kZShyb290ICsgIi5ESVNQTEFZUy5NT0JJTEUuTGFuZHNjYXBlLkRlZmF1bHQiKSwgd2ViTUkucXVlcnkpOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2FwVXJsID0gd2ViTUkuZGlzcGxheS5jcmVhdGVVUkwoZ2V0RGlzcGxheUNvZGUocm9vdCArICIuRElTUExBWVMuVEFCTEVULkxhbmRzY2FwZS5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0KCQkJfQoJCX1jYXRjaChleCl7CgkJCWlmKHdpbmRvdy5tYXRjaE1lZGlhKCIob3JpZW50YXRpb246IHBvcnRyYWl0KSIpLm1hdGNoZXMpewoJCQkJaWYoc2NyZWVuLndpZHRoID4gMTIwMCl7CgkJCQkJc3dhcFVybCA9IHdlYk1JLmRpc3BsYXkuY3JlYXRlVVJMKGdldERpc3BsYXlDb2RlKHJvb3QgKyAiLkRJU1BMQVlTLkRlZmF1bHQiKSwgd2ViTUkucXVlcnkpOwoJCQkJfSBlbHNlIGlmKHNjcmVlbi53aWR0aCA8IDUwMCl7CgkJCQkJc3dhcFVybCA9IHdlYk1JLmRpc3BsYXkuY3JlYXRlVVJMKGdldERpc3BsYXlDb2RlKHJvb3QgKyAiLkRJU1BMQVlTLk1PQklMRS5Qb3J0cmFpdC5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0gZWxzZSB7CgkJCQkJc3dhcFVybCA9IHdlYk1JLmRpc3BsYXkuY3JlYXRlVVJMKGdldERpc3BsYXlDb2RlKHJvb3QgKyAiLkRJU1BMQVlTLlRBQkxFVC5Qb3J0cmFpdC5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0KCQkJfSBlbHNlIGlmKHdpbmRvdy5tYXRjaE1lZGlhKCIob3JpZW50YXRpb246IGxhbmRzY2FwZSkiKS5tYXRjaGVzKXsKCQkJCWlmKHNjcmVlbi53aWR0aCA+IDE0MDApewoJCQkJCXN3YXBVcmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChnZXREaXNwbGF5Q29kZShyb290ICsgIi5ESVNQTEFZUy5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0gZWxzZSBpZihzY3JlZW4ud2lkdGggPCA3MDApewoJCQkJCXN3YXBVcmwgPSB3ZWJNSS5kaXNwbGF5LmNyZWF0ZVVSTChnZXREaXNwbGF5Q29kZShyb290ICsgIi5ESVNQTEFZUy5NT0JJTEUuTGFuZHNjYXBlLkRlZmF1bHQiKSwgd2ViTUkucXVlcnkpOwoJCQkJfSBlbHNlIHsKCQkJCQlzd2FwVXJsID0gd2ViTUkuZGlzcGxheS5jcmVhdGVVUkwoZ2V0RGlzcGxheUNvZGUocm9vdCArICIuRElTUExBWVMuVEFCTEVULkxhbmRzY2FwZS5EZWZhdWx0IiksIHdlYk1JLnF1ZXJ5KTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlpZiAodHlwZW9mIHN3YXBVcmwgIT09ICJ1bmRlZmluZWQiKQoJCQl1cmwgPSBzd2FwVXJsOwoKCQltYWluZnJhbWUuc3JjID0gdXJsOwoJfQoKCWlmKHdlYk1JQ29uZmlnLnJlc3BvbnNpdmVMaXRlKXsKCQlpZihkaXNwbGF5c0pzLmRlZmF1bHQuaW5kZXhPZigiLiIpID49IDApewoJCQlyb290ID0gZGlzcGxheXNKcy5kZWZhdWx0LnNwbGl0KCIuIilbMF07CgkJfSBlbHNlCgkJCXJvb3QgPSBnZXREaXNwbGF5TmFtZShkaXNwbGF5c0pzLmRlZmF1bHQpLnNwbGl0KCIuIilbMF07CgoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsIGZ1bmN0aW9uKCkgewoJCQlyZXNwb25zaXZlSGFuZGxlcigpOwoJCQl2YXIgYWN0aXZlRnJhbWVzID0gd2ViTUkuZnJhbWUuZ2V0QWN0aXZlRnJhbWVzKCk7CgkJCWZvcihmcmFtZSBpbiBhY3RpdmVGcmFtZXMpIHsKCQkJCWlmIChhY3RpdmVGcmFtZXNbZnJhbWVdLmF0dHJpYnV0ZXMuZnJhbWVuYW1lICYmIGFjdGl2ZUZyYW1lc1tmcmFtZV0uYXR0cmlidXRlcy5mcmFtZW5hbWUudmFsdWUgPT0gImNvbnRlbnQiKSB7CgkJCQkJdmFyIGRpc3BsYXlVUkwgPSBhY3RpdmVGcmFtZXNbZnJhbWVdLmNvbnRlbnRXaW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CgkJCQkJY3VycmVudE9EaXNwbGF5ID0gZGlzcGxheVVSTC5zdWJzdHJpbmcoZGlzcGxheVVSTC5sYXN0SW5kZXhPZignLycpKzEsZGlzcGxheVVSTC5sZW5ndGgpOwoJCQkJCWN1cnJlbnRPRGlzcGxheSA9IGN1cnJlbnRPRGlzcGxheS5yZXBsYWNlKCIuc3ZnIiwgIiIpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZihjdXJyZW50T0Rpc3BsYXkgIT0gIiIpIHsKCQkJCWlmKGN1cnJlbnRPRGlzcGxheS5pbmRleE9mKCIuIikgPj0gMCkKCQkJCQljdXJyZW50T0Rpc3BsYXkgPSBjdXJyZW50T0Rpc3BsYXkuaW5kZXhPZigiTGFuZHNjYXBlIikgPiAwID8gY3VycmVudE9EaXNwbGF5LnJlcGxhY2UoIkxhbmRzY2FwZSIsICJQb3J0cmFpdCIpIDogY3VycmVudE9EaXNwbGF5LnJlcGxhY2UoIlBvcnRyYWl0IiwgIkxhbmRzY2FwZSIpOwoJCQkJZWxzZSB7CgkJCQkJc3dhcEN1cnJlbnRPRGlzcGxheSA9IGdldERpc3BsYXlOYW1lKGN1cnJlbnRPRGlzcGxheSk7CgkJCQkJaWYodHlwZW9mIHN3YXBDdXJyZW50T0Rpc3BsYXkgPT09ICJ1bmRlZmluZWQiKQoJCQkJCQlyZXR1cm47CgoJCQkJCXN3YXBDdXJyZW50T0Rpc3BsYXkgPSBzd2FwQ3VycmVudE9EaXNwbGF5LmluZGV4T2YoIkxhbmRzY2FwZSIpID4gMCA/IHN3YXBDdXJyZW50T0Rpc3BsYXkucmVwbGFjZSgiTGFuZHNjYXBlIiwgIlBvcnRyYWl0IikgOiBzd2FwQ3VycmVudE9EaXNwbGF5LnJlcGxhY2UoIlBvcnRyYWl0IiwgIkxhbmRzY2FwZSIpOwoJCQkJCXN3YXBDdXJyZW50T0Rpc3BsYXkgPSBnZXREaXNwbGF5Q29kZShzd2FwQ3VycmVudE9EaXNwbGF5KTsKCgkJCQkJaWYodHlwZW9mIHN3YXBDdXJyZW50T0Rpc3BsYXkgPT09ICJ1bmRlZmluZWQiKQoJCQkJCQlyZXR1cm47CgoJCQkJCWN1cnJlbnRPRGlzcGxheSA9IHN3YXBDdXJyZW50T0Rpc3BsYXk7CgkJCQl9CQoJCQl9CgkJfSwgZmFsc2UpOwoJCXJlc3BvbnNpdmVIYW5kbGVyKCk7Cgl9IGVsc2UgewoJCW1haW5mcmFtZS5zcmMgPSB1cmwKCX0KfQoKdmFyIGN1cnJlbnRIb3N0TmFtZSA9ICIiOwp3ZWJNSS5hZGRFdmVudCh3ZWJNSS5kYXRhLCAnc2VydmVyc3RhdGVjaGFuZ2UnLCBmdW5jdGlvbihlKSB7CgljdXJyZW50SG9zdE5hbWUgPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBlLmFjdGl2ZS5jdXJyZW50SG9zdE5hbWUgKyAiLyI7Cn0pOwoKZnVuY3Rpb24gc3dpdGNoTGFuZ3VhZ2UobG5nKSB7CglsYW5ndWFnZSA9IGxuZzsKCWlmICghKGxhbmd1YWdlIGluIHByb2plY3QubGFuZ3VhZ2VzKSkgewoJCWlmICh0eXBlb2YgbGFuZ3VhZ2UgPT09ICJzdHJpbmciKQoJCQljb25zb2xlLmVycm9yKCJJbnZhbGlkIGxhbmd1YWdlICciICsgbG5nICsgIiciKTsKCQlsYW5ndWFnZSA9IG5hdmlnYXRvci5sYW5ndWFnZSA/IG5hdmlnYXRvci5sYW5ndWFnZSA6IG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2U7CgkJaWYgKCEobGFuZ3VhZ2UgaW4gcHJvamVjdC5sYW5ndWFnZXMpKSB7CgkJCXZhciBwb3MgPSBsYW5ndWFnZS5pbmRleE9mKCItIik7CgkJCWlmIChwb3MgPiAwKQoJCQkJbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgcG9zKTsKCQkJaWYgKCEobGFuZ3VhZ2UgaW4gcHJvamVjdC5sYW5ndWFnZXMpKSB7CgkJCQlmb3IgKHZhciBpIGluIHByb2plY3QubGFuZ3VhZ2VzKSB7CgkJCQkJbGFuZ3VhZ2UgPSBpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWhhbmRsZXIoInN3aXRjaGVkbGFuZ3VhZ2UiLCBsYW5ndWFnZSk7CgoJdmFyIHhtbEh0dHAgPSBmdW5jdGlvbigpIHsKCQlpZiAoIS9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKQoJCQlyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgoJCS8vIERvbid0IHVzZSB0aGUgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZvciBJRSBzaW5jZSB0aGUKCQkvLyBvdmVyd3JpdHRlbiBvYmplY3QgYnkgd2ViTUkuanMgd29uJ3Qgd29yayBpbiB3aW5kb3cub3BlbigpCgoJCXZhciB4aHJzID0gWyJNc3htbDIuWE1MSFRUUC42LjAiLCAiTXN4bWwyLlhNTEhUVFAuMy4wIiwgIk1zeG1sMi5YTUxIVFRQIiwgIk1pY3Jvc29mdC5YTUxIVFRQIl07CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgeGhycy5sZW5ndGg7ICsraSkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KHhocnNbaV0pOwoJCQl9IGNhdGNoIChlKSB7CgkJCX0KCQl9CgoJCXRocm93ICJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iOwoJfSgpOwoKCXhtbEh0dHAub3BlbigiR0VUIiwgY3VycmVudEhvc3ROYW1lICsgbGFuZ3VhZ2UgKyAiLyIgKyBkaXNwbGF5dHlwZSArICIvZGlzcGxheXMuanMiLCB0cnVlKTsKCXhtbEh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgkJaWYgKHhtbEh0dHAucmVhZHlTdGF0ZSA9PSA0ICYmIHhtbEh0dHAuc3RhdHVzID09IDIwMCkgewoJCQlkaXNwbGF5c0pzID0gSlNPTi5wYXJzZSh4bWxIdHRwLnJlc3BvbnNlVGV4dCk7CgkJCWhhbmRsZXIoImxvYWRlZGRpc3BsYXlzanMiLCBkaXNwbGF5c0pzKTsKCQkJbG9hZEV2ZW50KGxhbmd1YWdlKTsKCQl9Cgl9OwoJeG1sSHR0cC5zZW5kKG51bGwpOwp9Cgp3ZWJNSS5hZGRFdmVudCh3ZWJNSS5kYXRhLCAic3RhdGVjaGFuZ2UiLCBmdW5jdGlvbihzdGF0ZSkgewoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVycm9yc2NyZWVuIikuc3R5bGUuZGlzcGxheSA9IHN0YXRlIDwgMCA/ICJibG9jayIgOiAibm9uZSI7Cn0pOwoKCndlYk1JLmFkZE9ubG9hZChmdW5jdGlvbigpIHsKCXZhciBtYWluZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpbmZyYW1lIik7CgoJaWYgKCF0aGlzLmlzUm9vdERpc3BsYXkpIHsKCQl3ZWJNSS50cmlnZ2VyLmZpcmUoImNvbS5hdHZpc2Uuc3ViV2luZG93TG9hZGVkIiwgdGhpcyk7Cgl9CgoJaWYoYXV0b2ZpdCl7CgkJZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwoJfQoKCXdlYk1JLmFkZEV2ZW50KG1haW5mcmFtZSwgImxvYWQiLCBmdW5jdGlvbigpIHsKCgkJdHJ5IHsKCQkJaWYoZGlzcGxheXR5cGUgPT0gInhodG1sIil7CgkJCQltYWluZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkuc3R5bGVbIm92ZXJmbG93Il0gPSAiaGlkZGVuIjsKCQkJfQoJCQl2YXIgcm9vdFN2ZyA9IG1haW5mcmFtZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoJCQlpZihkaXNwbGF5dHlwZT09InhodG1sIil7CgkJCQlyb290U3ZnID0gcm9vdFN2Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3ZnIilbMF07CgkJCX0KCQkJdmFyIHJvb3RTdmdWaWV3Qm94ID0gbWFpbmZyYW1lLmNvbnRlbnRXaW5kb3cud2ViTUkuZGlzcGxheS5nZXRJbml0aWFsVmlld0JveCgpOwoKCQkJdmFyIHZpZXdwb3J0d2lkdGggPSByb290U3ZnVmlld0JveFsyXTsKCQkJcm9vdFN2Zy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CgkJCXJvb3RTdmcuc3R5bGUud2lkdGggPSAiMTAwJSI7CgoJCQlpZiAoaXNNb2JpbGVUb3VjaERldmljZSkgewoJCQkJaWYgKCFhdXRvZml0ICYmIGlzUm9vdERpc3BsYXkpewoJCQkJCXZhciB2aWV3cG9ydE1ldGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld3BvcnQtbWV0YScpOwoJCQkJCXZpZXdwb3J0TWV0YS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCAid2lkdGg9IiArIHZpZXdwb3J0d2lkdGggKyAiLCB1c2VyLXNjYWxhYmxlPXllcyIpOwoJCQkJfQoJCQl9CgkJCWlmKHR5cGVvZiBjdXJyZW50T0Rpc3BsYXkgIT0gInVuZGVmaW5lZCIgJiYgY3VycmVudE9EaXNwbGF5ICE9ICIiKQoJCQkJd2ViTUkuZGlzcGxheS5vcGVuRGlzcGxheShjdXJyZW50T0Rpc3BsYXkpOwoJCX1jYXRjaChleCl7fQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nc2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQloYW5kbGVyKCJsb2FkZWRtYWluZnJhbWUiLCBtYWluZnJhbWUpOwoJfSk7CgoJbG9hZEV2ZW50KCk7Cglzd2l0Y2hMYW5ndWFnZShsYW5ndWFnZSk7Cn0pOwovKl1dPiovPC9zY3JpcHQ+Cgk8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Ii9mYXZpY29uLmljbz92PTEiIHR5cGU9ImltYWdlL3gtaWNvbiIgLz4KCTwvaGVhZD4KCTxib2R5PgoJCTxkaXYgaWQ9Im1haW5Db250YWluZXIiIGNsYXNzPSJtYWluQ29udGFpbmVyRGVmYXVsdFN0eWxlIj4KCQkJPGlmcmFtZSBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCUiIGlkPSJtYWluZnJhbWUiIHNyYz0iYWJvdXQ6YmxhbmsiIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4KCQkJPGRpdiBpZD0iZm9yZWlnbm9iamVjdHMiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Ij48L2Rpdj4KCQkJPGRpdiBpZD0iZXh0ZW5zaW9ucyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MCI+PC9kaXY+CgkJCTxkaXYgaWQ9ImxvYWRpbmdzY3JlZW4iPjwvZGl2PgoJCQk8ZGl2IGlkPSJlcnJvcnNjcmVlbiI+PGRpdiBpZD0iZXJyb3JvdmVybGF5Ij4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJlcnJvcm1lc3NhZ2UiPjxkaXYgaWQ9ImVycm9yYm94Ij48ZGl2PjxzcGFuIGlkPSJlcnJvcnJvdzEiPkEgPGI+Y29ubmVjdGlvbiBlcnJvcjwvYj4gbWF5IGhhdmUgb2NjdXJyZWQuPC9zcGFuPjxzcGFuIGlkPSJlcnJvcnJvdzIiPlBsZWFzZSA8Yj5yZWZyZXNoPC9iPiB5b3VyIGJyb3dzZXIgb3IgPGEgaHJlZj0iIyIgb25jbGljaz0id2luZG93LmxvY2F0aW9uLnJlbG9hZCgpIj5jbGljayBoZXJlPC9hPi48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+CgkJPC9kaXY+Cgk8L2JvZHk+CjwvaHRtbD4K</uax:ByteString>
		</Value>
	</UAVariable>
</UANodeSet>
