taon-typeorm 18.0.23 → 19.0.0
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/assets/shared/shared_folder_info.txt +1 -1
- package/package.json +1 -1
- package/tmp-environment.json +24 -3
- package/browser/esm2022/lib/index.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/browser/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/browser/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/browser/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/browser/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/browser/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/browser/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/browser/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/browser/esm2022/lib/typeorm/constants.mjs +0 -4
- package/browser/esm2022/lib/typeorm/container.mjs +0 -57
- package/browser/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/browser/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/browser/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/browser/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/browser/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/browser/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/browser/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/browser/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/browser/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/browser/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/browser/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/browser/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/browser/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/browser/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/browser/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/browser/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/browser/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/browser/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/browser/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/browser/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/browser/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/browser/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/browser/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/browser/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/browser/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/browser/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/browser/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/browser/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/browser/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/browser/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/browser/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/browser/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/browser/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/browser/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/browser/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/browser/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/browser/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/browser/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/browser/esm2022/lib/typeorm/globals.mjs +0 -165
- package/browser/esm2022/lib/typeorm/index.mjs +0 -157
- package/browser/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/browser/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/browser/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/browser/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/browser/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/browser/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/browser/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/browser/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/browser/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/browser/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/browser/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/browser/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/browser/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/browser/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/browser/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/browser/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/browser/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/browser/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/browser/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/browser/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/browser/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/browser/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/browser/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/browser/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/browser/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/browser/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/browser/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/browser/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/browser/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/browser/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/browser/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/browser/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/browser/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/browser/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/browser/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/browser/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/browser/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
- package/browser/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/browser/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/browser/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/browser/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/browser/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/browser/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/browser/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/browser/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/browser/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/browser/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/browser/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/browser/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/browser/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/browser/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/browser/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/browser/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/browser/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/browser/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/browser/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/browser/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/browser/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/browser/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/browser/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/browser/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/browser/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/browser/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/browser/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/browser/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/browser/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/browser/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/browser/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/browser/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/browser/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/browser/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/browser/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/browser/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/browser/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/browser/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/browser/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/browser/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/browser/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/browser/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/browser/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/browser/esm2022/public-api.mjs +0 -2
- package/browser/esm2022/taon-typeorm.mjs +0 -5
- package/client/esm2022/lib/index.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/client/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/client/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/client/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/client/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/client/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/client/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/client/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/client/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/client/esm2022/lib/typeorm/constants.mjs +0 -4
- package/client/esm2022/lib/typeorm/container.mjs +0 -57
- package/client/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/client/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/client/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/client/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/client/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/client/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/client/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/client/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/client/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/client/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/client/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/client/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/client/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/client/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/client/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/client/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/client/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/client/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/client/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/client/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/client/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/client/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/client/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/client/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/client/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/client/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/client/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/client/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/client/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/client/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/client/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/client/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/client/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/client/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/client/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/client/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/client/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/client/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/client/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/client/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/client/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/client/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/client/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/client/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/client/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/client/esm2022/lib/typeorm/globals.mjs +0 -165
- package/client/esm2022/lib/typeorm/index.mjs +0 -157
- package/client/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/client/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/client/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/client/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/client/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/client/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/client/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/client/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/client/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/client/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/client/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/client/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/client/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/client/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/client/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/client/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/client/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/client/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/client/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/client/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/client/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/client/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/client/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/client/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/client/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/client/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/client/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/client/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/client/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/client/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/client/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/client/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/client/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/client/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/client/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/client/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/client/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/client/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/client/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
- package/client/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/client/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/client/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/client/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/client/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/client/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/client/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/client/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/client/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/client/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/client/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/client/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/client/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/client/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/client/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/client/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/client/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/client/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/client/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/client/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/client/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/client/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/client/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/client/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/client/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/client/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/client/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/client/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/client/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/client/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/client/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/client/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/client/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/client/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/client/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/client/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/client/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/client/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/client/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/client/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/client/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/client/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/client/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/client/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/client/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/client/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/client/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/client/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/client/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/client/esm2022/public-api.mjs +0 -2
- package/client/esm2022/taon-typeorm.mjs +0 -5
- package/taon.jsonc +0 -8
- package/websql/esm2022/lib/index.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/websql/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/websql/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/websql/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/websql/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/websql/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/websql/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/websql/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/websql/esm2022/lib/typeorm/constants.mjs +0 -4
- package/websql/esm2022/lib/typeorm/container.mjs +0 -57
- package/websql/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/websql/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/websql/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/websql/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/websql/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/websql/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/websql/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/websql/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/websql/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/websql/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/websql/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/websql/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/websql/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/websql/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/websql/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/websql/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/websql/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/websql/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/websql/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/websql/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/websql/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/websql/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/websql/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/websql/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/websql/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/websql/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/websql/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/websql/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/websql/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/websql/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/websql/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/websql/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/websql/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/websql/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/websql/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/websql/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/websql/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/websql/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/websql/esm2022/lib/typeorm/globals.mjs +0 -165
- package/websql/esm2022/lib/typeorm/index.mjs +0 -157
- package/websql/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/websql/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/websql/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/websql/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/websql/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/websql/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/websql/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/websql/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/websql/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/websql/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/websql/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/websql/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/websql/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/websql/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/websql/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/websql/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/websql/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/websql/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/websql/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/websql/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/websql/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/websql/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/websql/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/websql/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/websql/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/websql/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/websql/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/websql/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/websql/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/websql/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/websql/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/websql/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/websql/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/websql/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/websql/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/websql/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/websql/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -331
- package/websql/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/websql/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/websql/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/websql/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/websql/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/websql/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/websql/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/websql/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/websql/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/websql/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/websql/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/websql/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/websql/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/websql/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/websql/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/websql/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/websql/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/websql/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/websql/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/websql/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/websql/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/websql/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/websql/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/websql/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/websql/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/websql/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/websql/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/websql/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/websql/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/websql/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/websql/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/websql/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/websql/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/websql/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/websql/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/websql/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/websql/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/websql/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/websql/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/websql/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/websql/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/websql/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/websql/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/websql/esm2022/public-api.mjs +0 -2
- package/websql/esm2022/taon-typeorm.mjs +0 -5
|
@@ -1,2278 +0,0 @@
|
|
|
1
|
-
var SelectQueryBuilder_1;
|
|
2
|
-
import { __decorate } from "tslib";
|
|
3
|
-
import { RawSqlResultsToEntityTransformer } from "./transformer/RawSqlResultsToEntityTransformer";
|
|
4
|
-
import { PessimisticLockTransactionRequiredError } from "../error/PessimisticLockTransactionRequiredError";
|
|
5
|
-
import { NoVersionOrUpdateDateColumnError } from "../error/NoVersionOrUpdateDateColumnError";
|
|
6
|
-
import { OptimisticLockVersionMismatchError } from "../error/OptimisticLockVersionMismatchError";
|
|
7
|
-
import { OptimisticLockCanNotBeUsedError } from "../error/OptimisticLockCanNotBeUsedError";
|
|
8
|
-
import { JoinAttribute } from "./JoinAttribute";
|
|
9
|
-
import { RelationIdAttribute } from "./relation-id/RelationIdAttribute";
|
|
10
|
-
import { RelationCountAttribute } from "./relation-count/RelationCountAttribute";
|
|
11
|
-
import { RelationIdLoader } from "./relation-id/RelationIdLoader";
|
|
12
|
-
import { RelationIdMetadataToAttributeTransformer } from "./relation-id/RelationIdMetadataToAttributeTransformer";
|
|
13
|
-
import { RelationCountLoader } from "./relation-count/RelationCountLoader";
|
|
14
|
-
import { RelationCountMetadataToAttributeTransformer } from "./relation-count/RelationCountMetadataToAttributeTransformer";
|
|
15
|
-
import { QueryBuilder } from "./QueryBuilder";
|
|
16
|
-
/* */
|
|
17
|
-
/* */
|
|
18
|
-
import { LockNotSupportedOnGivenDriverError } from "../error/LockNotSupportedOnGivenDriverError";
|
|
19
|
-
import { OffsetWithoutLimitNotSupportedError } from "../error/OffsetWithoutLimitNotSupportedError";
|
|
20
|
-
import { ObjectUtils } from "../util/ObjectUtils";
|
|
21
|
-
import { DriverUtils } from "../driver/DriverUtils";
|
|
22
|
-
import { EntityNotFoundError } from "../error/EntityNotFoundError";
|
|
23
|
-
import { TypeORMError } from "../error";
|
|
24
|
-
import { FindOptionsUtils } from "../find-options/FindOptionsUtils";
|
|
25
|
-
import { ApplyValueTransformers } from "../util/ApplyValueTransformers";
|
|
26
|
-
import { OrmUtils } from "../util/OrmUtils";
|
|
27
|
-
import { EntityPropertyNotFoundError } from "../error/EntityPropertyNotFoundError";
|
|
28
|
-
/* */
|
|
29
|
-
/* */
|
|
30
|
-
import { InstanceChecker } from "../util/InstanceChecker";
|
|
31
|
-
import { CLASS } from "typescript-class-helpers/browser";
|
|
32
|
-
/**
|
|
33
|
-
* Allows to build complex sql queries in a fashion way and execute those queries.
|
|
34
|
-
*/
|
|
35
|
-
let SelectQueryBuilder = SelectQueryBuilder_1 = class SelectQueryBuilder extends QueryBuilder {
|
|
36
|
-
constructor() {
|
|
37
|
-
super(...arguments);
|
|
38
|
-
this["@instanceof"] = Symbol.for("SelectQueryBuilder");
|
|
39
|
-
this.findOptions = {};
|
|
40
|
-
this.selects = [];
|
|
41
|
-
this.joins = [];
|
|
42
|
-
this.conditions = "";
|
|
43
|
-
this.orderBys = [];
|
|
44
|
-
this.relationMetadatas = [];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Gets generated SQL query without parameters being replaced.
|
|
48
|
-
*/
|
|
49
|
-
getQuery() {
|
|
50
|
-
let sql = this.createComment();
|
|
51
|
-
sql += this.createCteExpression();
|
|
52
|
-
sql += this.createSelectExpression();
|
|
53
|
-
sql += this.createJoinExpression();
|
|
54
|
-
sql += this.createWhereExpression();
|
|
55
|
-
sql += this.createGroupByExpression();
|
|
56
|
-
sql += this.createHavingExpression();
|
|
57
|
-
sql += this.createOrderByExpression();
|
|
58
|
-
sql += this.createLimitOffsetExpression();
|
|
59
|
-
sql += this.createLockExpression();
|
|
60
|
-
sql = sql.trim();
|
|
61
|
-
if (this.expressionMap.subQuery)
|
|
62
|
-
sql = "(" + sql + ")";
|
|
63
|
-
return sql;
|
|
64
|
-
}
|
|
65
|
-
setFindOptions(findOptions) {
|
|
66
|
-
this.findOptions = findOptions;
|
|
67
|
-
this.applyFindOptions();
|
|
68
|
-
return this;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Creates a subquery - query that can be used inside other queries.
|
|
72
|
-
*/
|
|
73
|
-
subQuery() {
|
|
74
|
-
const qb = this.createQueryBuilder();
|
|
75
|
-
qb.expressionMap.subQuery = true;
|
|
76
|
-
qb.parentQueryBuilder = this;
|
|
77
|
-
return qb;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Creates SELECT query and selects given data.
|
|
81
|
-
* Replaces all previous selections if they exist.
|
|
82
|
-
*/
|
|
83
|
-
select(selection, selectionAliasName) {
|
|
84
|
-
this.expressionMap.queryType = "select";
|
|
85
|
-
if (Array.isArray(selection)) {
|
|
86
|
-
this.expressionMap.selects = selection.map((selection) => ({
|
|
87
|
-
selection: selection,
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
else if (typeof selection === "function") {
|
|
91
|
-
const subQueryBuilder = selection(this.subQuery());
|
|
92
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
93
|
-
this.expressionMap.selects.push({
|
|
94
|
-
selection: subQueryBuilder.getQuery(),
|
|
95
|
-
aliasName: selectionAliasName,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else if (selection) {
|
|
99
|
-
this.expressionMap.selects = [
|
|
100
|
-
{ selection: selection, aliasName: selectionAliasName },
|
|
101
|
-
];
|
|
102
|
-
}
|
|
103
|
-
return this;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Adds new selection to the SELECT query.
|
|
107
|
-
*/
|
|
108
|
-
addSelect(selection, selectionAliasName) {
|
|
109
|
-
if (!selection)
|
|
110
|
-
return this;
|
|
111
|
-
if (Array.isArray(selection)) {
|
|
112
|
-
this.expressionMap.selects = this.expressionMap.selects.concat(selection.map((selection) => ({ selection: selection })));
|
|
113
|
-
}
|
|
114
|
-
else if (typeof selection === "function") {
|
|
115
|
-
const subQueryBuilder = selection(this.subQuery());
|
|
116
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
117
|
-
this.expressionMap.selects.push({
|
|
118
|
-
selection: subQueryBuilder.getQuery(),
|
|
119
|
-
aliasName: selectionAliasName,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
else if (selection) {
|
|
123
|
-
this.expressionMap.selects.push({
|
|
124
|
-
selection: selection,
|
|
125
|
-
aliasName: selectionAliasName,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Set max execution time.
|
|
132
|
-
* @param milliseconds
|
|
133
|
-
*/
|
|
134
|
-
maxExecutionTime(milliseconds) {
|
|
135
|
-
this.expressionMap.maxExecutionTime = milliseconds;
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Sets whether the selection is DISTINCT.
|
|
140
|
-
*/
|
|
141
|
-
distinct(distinct = true) {
|
|
142
|
-
this.expressionMap.selectDistinct = distinct;
|
|
143
|
-
return this;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Sets the distinct on clause for Postgres.
|
|
147
|
-
*/
|
|
148
|
-
distinctOn(distinctOn) {
|
|
149
|
-
this.expressionMap.selectDistinctOn = distinctOn;
|
|
150
|
-
return this;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Specifies FROM which entity's table select/update/delete will be executed.
|
|
154
|
-
* Also sets a main string alias of the selection data.
|
|
155
|
-
* Removes all previously set from-s.
|
|
156
|
-
*/
|
|
157
|
-
from(entityTarget, aliasName) {
|
|
158
|
-
const mainAlias = this.createFromAlias(entityTarget, aliasName);
|
|
159
|
-
this.expressionMap.setMainAlias(mainAlias);
|
|
160
|
-
return this;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Specifies FROM which entity's table select/update/delete will be executed.
|
|
164
|
-
* Also sets a main string alias of the selection data.
|
|
165
|
-
*/
|
|
166
|
-
addFrom(entityTarget, aliasName) {
|
|
167
|
-
const alias = this.createFromAlias(entityTarget, aliasName);
|
|
168
|
-
if (!this.expressionMap.mainAlias)
|
|
169
|
-
this.expressionMap.setMainAlias(alias);
|
|
170
|
-
return this;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* INNER JOINs (without selection).
|
|
174
|
-
* You also need to specify an alias of the joined data.
|
|
175
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
176
|
-
*/
|
|
177
|
-
innerJoin(entityOrProperty, alias, condition, parameters) {
|
|
178
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters);
|
|
179
|
-
return this;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* LEFT JOINs (without selection).
|
|
183
|
-
* You also need to specify an alias of the joined data.
|
|
184
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
185
|
-
*/
|
|
186
|
-
leftJoin(entityOrProperty, alias, condition, parameters) {
|
|
187
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters);
|
|
188
|
-
return this;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* INNER JOINs and adds all selection properties to SELECT.
|
|
192
|
-
* You also need to specify an alias of the joined data.
|
|
193
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
194
|
-
*/
|
|
195
|
-
innerJoinAndSelect(entityOrProperty, alias, condition, parameters) {
|
|
196
|
-
this.addSelect(alias);
|
|
197
|
-
this.innerJoin(entityOrProperty, alias, condition, parameters);
|
|
198
|
-
return this;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* LEFT JOINs and adds all selection properties to SELECT.
|
|
202
|
-
* You also need to specify an alias of the joined data.
|
|
203
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
204
|
-
*/
|
|
205
|
-
leftJoinAndSelect(entityOrProperty, alias, condition, parameters) {
|
|
206
|
-
this.addSelect(alias);
|
|
207
|
-
this.leftJoin(entityOrProperty, alias, condition, parameters);
|
|
208
|
-
return this;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
212
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
213
|
-
* It will assume that there are multiple rows of selecting data, and mapped result will be an array.
|
|
214
|
-
* You also need to specify an alias of the joined data.
|
|
215
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
216
|
-
*/
|
|
217
|
-
innerJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
218
|
-
this.addSelect(alias);
|
|
219
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, true);
|
|
220
|
-
return this;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
224
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
225
|
-
* It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
|
|
226
|
-
* You also need to specify an alias of the joined data.
|
|
227
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
228
|
-
*/
|
|
229
|
-
innerJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
230
|
-
this.addSelect(alias);
|
|
231
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, false);
|
|
232
|
-
return this;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
236
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
237
|
-
* It will assume that there are multiple rows of selecting data, and mapped result will be an array.
|
|
238
|
-
* You also need to specify an alias of the joined data.
|
|
239
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
240
|
-
*/
|
|
241
|
-
leftJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
242
|
-
this.addSelect(alias);
|
|
243
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, true);
|
|
244
|
-
return this;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
248
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
249
|
-
* It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
|
|
250
|
-
* You also need to specify an alias of the joined data.
|
|
251
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
252
|
-
*/
|
|
253
|
-
leftJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
254
|
-
this.addSelect(alias);
|
|
255
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, false);
|
|
256
|
-
return this;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* LEFT JOINs relation id and maps it into some entity's property.
|
|
260
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
261
|
-
*/
|
|
262
|
-
loadRelationIdAndMap(mapToProperty, relationName, aliasNameOrOptions, queryBuilderFactory) {
|
|
263
|
-
const relationIdAttribute = new RelationIdAttribute(this.expressionMap);
|
|
264
|
-
relationIdAttribute.mapToProperty = mapToProperty;
|
|
265
|
-
relationIdAttribute.relationName = relationName;
|
|
266
|
-
if (typeof aliasNameOrOptions === "string")
|
|
267
|
-
relationIdAttribute.alias = aliasNameOrOptions;
|
|
268
|
-
if (typeof aliasNameOrOptions === "object" &&
|
|
269
|
-
aliasNameOrOptions.disableMixedMap)
|
|
270
|
-
relationIdAttribute.disableMixedMap = true;
|
|
271
|
-
relationIdAttribute.queryBuilderFactory = queryBuilderFactory;
|
|
272
|
-
this.expressionMap.relationIdAttributes.push(relationIdAttribute);
|
|
273
|
-
if (relationIdAttribute.relation.junctionEntityMetadata) {
|
|
274
|
-
this.expressionMap.createAlias({
|
|
275
|
-
type: "other",
|
|
276
|
-
name: relationIdAttribute.junctionAlias,
|
|
277
|
-
metadata: relationIdAttribute.relation.junctionEntityMetadata,
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
return this;
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Counts number of entities of entity's relation and maps the value into some entity's property.
|
|
284
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
285
|
-
*/
|
|
286
|
-
loadRelationCountAndMap(mapToProperty, relationName, aliasName, queryBuilderFactory) {
|
|
287
|
-
const relationCountAttribute = new RelationCountAttribute(this.expressionMap);
|
|
288
|
-
relationCountAttribute.mapToProperty = mapToProperty;
|
|
289
|
-
relationCountAttribute.relationName = relationName;
|
|
290
|
-
relationCountAttribute.alias = aliasName;
|
|
291
|
-
relationCountAttribute.queryBuilderFactory = queryBuilderFactory;
|
|
292
|
-
this.expressionMap.relationCountAttributes.push(relationCountAttribute);
|
|
293
|
-
this.expressionMap.createAlias({
|
|
294
|
-
type: "other",
|
|
295
|
-
name: relationCountAttribute.junctionAlias,
|
|
296
|
-
});
|
|
297
|
-
if (relationCountAttribute.relation.junctionEntityMetadata) {
|
|
298
|
-
this.expressionMap.createAlias({
|
|
299
|
-
type: "other",
|
|
300
|
-
name: relationCountAttribute.junctionAlias,
|
|
301
|
-
metadata: relationCountAttribute.relation.junctionEntityMetadata,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
return this;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Loads all relation ids for all relations of the selected entity.
|
|
308
|
-
* All relation ids will be mapped to relation property themself.
|
|
309
|
-
* If array of strings is given then loads only relation ids of the given properties.
|
|
310
|
-
*/
|
|
311
|
-
loadAllRelationIds(options) {
|
|
312
|
-
this.expressionMap.mainAlias.metadata.relations.forEach((relation) => {
|
|
313
|
-
if (options !== undefined &&
|
|
314
|
-
options.relations !== undefined &&
|
|
315
|
-
options.relations.indexOf(relation.propertyPath) === -1)
|
|
316
|
-
return;
|
|
317
|
-
this.loadRelationIdAndMap(this.expressionMap.mainAlias.name +
|
|
318
|
-
"." +
|
|
319
|
-
relation.propertyPath, this.expressionMap.mainAlias.name +
|
|
320
|
-
"." +
|
|
321
|
-
relation.propertyPath, options);
|
|
322
|
-
});
|
|
323
|
-
return this;
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Sets WHERE condition in the query builder.
|
|
327
|
-
* If you had previously WHERE expression defined,
|
|
328
|
-
* calling this function will override previously set WHERE conditions.
|
|
329
|
-
* Additionally you can add parameters used in where expression.
|
|
330
|
-
*/
|
|
331
|
-
where(where, parameters) {
|
|
332
|
-
this.expressionMap.wheres = []; // don't move this block below since computeWhereParameter can add where expressions
|
|
333
|
-
const condition = this.getWhereCondition(where);
|
|
334
|
-
if (condition)
|
|
335
|
-
this.expressionMap.wheres = [
|
|
336
|
-
{ type: "simple", condition: condition },
|
|
337
|
-
];
|
|
338
|
-
if (parameters)
|
|
339
|
-
this.setParameters(parameters);
|
|
340
|
-
return this;
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Adds new AND WHERE condition in the query builder.
|
|
344
|
-
* Additionally you can add parameters used in where expression.
|
|
345
|
-
*/
|
|
346
|
-
andWhere(where, parameters) {
|
|
347
|
-
this.expressionMap.wheres.push({
|
|
348
|
-
type: "and",
|
|
349
|
-
condition: this.getWhereCondition(where),
|
|
350
|
-
});
|
|
351
|
-
if (parameters)
|
|
352
|
-
this.setParameters(parameters);
|
|
353
|
-
return this;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Adds new OR WHERE condition in the query builder.
|
|
357
|
-
* Additionally you can add parameters used in where expression.
|
|
358
|
-
*/
|
|
359
|
-
orWhere(where, parameters) {
|
|
360
|
-
this.expressionMap.wheres.push({
|
|
361
|
-
type: "or",
|
|
362
|
-
condition: this.getWhereCondition(where),
|
|
363
|
-
});
|
|
364
|
-
if (parameters)
|
|
365
|
-
this.setParameters(parameters);
|
|
366
|
-
return this;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Adds new AND WHERE with conditions for the given ids.
|
|
370
|
-
*
|
|
371
|
-
* Ids are mixed.
|
|
372
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
373
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
374
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
375
|
-
*/
|
|
376
|
-
whereInIds(ids) {
|
|
377
|
-
return this.where(this.getWhereInIdsCondition(ids));
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Adds new AND WHERE with conditions for the given ids.
|
|
381
|
-
*
|
|
382
|
-
* Ids are mixed.
|
|
383
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
384
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
385
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
386
|
-
*/
|
|
387
|
-
andWhereInIds(ids) {
|
|
388
|
-
return this.andWhere(this.getWhereInIdsCondition(ids));
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Adds new OR WHERE with conditions for the given ids.
|
|
392
|
-
*
|
|
393
|
-
* Ids are mixed.
|
|
394
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
395
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
396
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
397
|
-
*/
|
|
398
|
-
orWhereInIds(ids) {
|
|
399
|
-
return this.orWhere(this.getWhereInIdsCondition(ids));
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Sets HAVING condition in the query builder.
|
|
403
|
-
* If you had previously HAVING expression defined,
|
|
404
|
-
* calling this function will override previously set HAVING conditions.
|
|
405
|
-
* Additionally you can add parameters used in where expression.
|
|
406
|
-
*/
|
|
407
|
-
having(having, parameters) {
|
|
408
|
-
this.expressionMap.havings.push({ type: "simple", condition: having });
|
|
409
|
-
if (parameters)
|
|
410
|
-
this.setParameters(parameters);
|
|
411
|
-
return this;
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Adds new AND HAVING condition in the query builder.
|
|
415
|
-
* Additionally you can add parameters used in where expression.
|
|
416
|
-
*/
|
|
417
|
-
andHaving(having, parameters) {
|
|
418
|
-
this.expressionMap.havings.push({ type: "and", condition: having });
|
|
419
|
-
if (parameters)
|
|
420
|
-
this.setParameters(parameters);
|
|
421
|
-
return this;
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Adds new OR HAVING condition in the query builder.
|
|
425
|
-
* Additionally you can add parameters used in where expression.
|
|
426
|
-
*/
|
|
427
|
-
orHaving(having, parameters) {
|
|
428
|
-
this.expressionMap.havings.push({ type: "or", condition: having });
|
|
429
|
-
if (parameters)
|
|
430
|
-
this.setParameters(parameters);
|
|
431
|
-
return this;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Sets GROUP BY condition in the query builder.
|
|
435
|
-
* If you had previously GROUP BY expression defined,
|
|
436
|
-
* calling this function will override previously set GROUP BY conditions.
|
|
437
|
-
*/
|
|
438
|
-
groupBy(groupBy) {
|
|
439
|
-
if (groupBy) {
|
|
440
|
-
this.expressionMap.groupBys = [groupBy];
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
this.expressionMap.groupBys = [];
|
|
444
|
-
}
|
|
445
|
-
return this;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Adds GROUP BY condition in the query builder.
|
|
449
|
-
*/
|
|
450
|
-
addGroupBy(groupBy) {
|
|
451
|
-
this.expressionMap.groupBys.push(groupBy);
|
|
452
|
-
return this;
|
|
453
|
-
}
|
|
454
|
-
/**
|
|
455
|
-
* Sets ORDER BY condition in the query builder.
|
|
456
|
-
* If you had previously ORDER BY expression defined,
|
|
457
|
-
* calling this function will override previously set ORDER BY conditions.
|
|
458
|
-
*/
|
|
459
|
-
orderBy(sort, order = "ASC", nulls) {
|
|
460
|
-
if (order !== undefined && order !== "ASC" && order !== "DESC")
|
|
461
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
|
|
462
|
-
if (nulls !== undefined &&
|
|
463
|
-
nulls !== "NULLS FIRST" &&
|
|
464
|
-
nulls !== "NULLS LAST")
|
|
465
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
|
|
466
|
-
if (sort) {
|
|
467
|
-
if (typeof sort === "object") {
|
|
468
|
-
this.expressionMap.orderBys = sort;
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
if (nulls) {
|
|
472
|
-
this.expressionMap.orderBys = {
|
|
473
|
-
[sort]: { order, nulls },
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
this.expressionMap.orderBys = { [sort]: order };
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
this.expressionMap.orderBys = {};
|
|
483
|
-
}
|
|
484
|
-
return this;
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* Adds ORDER BY condition in the query builder.
|
|
488
|
-
*/
|
|
489
|
-
addOrderBy(sort, order = "ASC", nulls) {
|
|
490
|
-
if (order !== undefined && order !== "ASC" && order !== "DESC")
|
|
491
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
|
|
492
|
-
if (nulls !== undefined &&
|
|
493
|
-
nulls !== "NULLS FIRST" &&
|
|
494
|
-
nulls !== "NULLS LAST")
|
|
495
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
|
|
496
|
-
if (nulls) {
|
|
497
|
-
this.expressionMap.orderBys[sort] = { order, nulls };
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
this.expressionMap.orderBys[sort] = order;
|
|
501
|
-
}
|
|
502
|
-
return this;
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Set's LIMIT - maximum number of rows to be selected.
|
|
506
|
-
* NOTE that it may not work as you expect if you are using joins.
|
|
507
|
-
* If you want to implement pagination, and you are having join in your query,
|
|
508
|
-
* then use instead take method instead.
|
|
509
|
-
*/
|
|
510
|
-
limit(limit) {
|
|
511
|
-
this.expressionMap.limit = this.normalizeNumber(limit);
|
|
512
|
-
if (this.expressionMap.limit !== undefined &&
|
|
513
|
-
isNaN(this.expressionMap.limit))
|
|
514
|
-
throw new TypeORMError(`Provided "limit" value is not a number. Please provide a numeric value.`);
|
|
515
|
-
return this;
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Set's OFFSET - selection offset.
|
|
519
|
-
* NOTE that it may not work as you expect if you are using joins.
|
|
520
|
-
* If you want to implement pagination, and you are having join in your query,
|
|
521
|
-
* then use instead skip method instead.
|
|
522
|
-
*/
|
|
523
|
-
offset(offset) {
|
|
524
|
-
this.expressionMap.offset = this.normalizeNumber(offset);
|
|
525
|
-
if (this.expressionMap.offset !== undefined &&
|
|
526
|
-
isNaN(this.expressionMap.offset))
|
|
527
|
-
throw new TypeORMError(`Provided "offset" value is not a number. Please provide a numeric value.`);
|
|
528
|
-
return this;
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* Sets maximal number of entities to take.
|
|
532
|
-
*/
|
|
533
|
-
take(take) {
|
|
534
|
-
this.expressionMap.take = this.normalizeNumber(take);
|
|
535
|
-
if (this.expressionMap.take !== undefined &&
|
|
536
|
-
isNaN(this.expressionMap.take))
|
|
537
|
-
throw new TypeORMError(`Provided "take" value is not a number. Please provide a numeric value.`);
|
|
538
|
-
return this;
|
|
539
|
-
}
|
|
540
|
-
/**
|
|
541
|
-
* Sets number of entities to skip.
|
|
542
|
-
*/
|
|
543
|
-
skip(skip) {
|
|
544
|
-
this.expressionMap.skip = this.normalizeNumber(skip);
|
|
545
|
-
if (this.expressionMap.skip !== undefined &&
|
|
546
|
-
isNaN(this.expressionMap.skip))
|
|
547
|
-
throw new TypeORMError(`Provided "skip" value is not a number. Please provide a numeric value.`);
|
|
548
|
-
return this;
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* Set certain index to be used by the query.
|
|
552
|
-
*
|
|
553
|
-
* @param index Name of index to be used.
|
|
554
|
-
*/
|
|
555
|
-
useIndex(index) {
|
|
556
|
-
this.expressionMap.useIndex = index;
|
|
557
|
-
return this;
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Sets locking mode.
|
|
561
|
-
*/
|
|
562
|
-
setLock(lockMode, lockVersion, lockTables) {
|
|
563
|
-
this.expressionMap.lockMode = lockMode;
|
|
564
|
-
this.expressionMap.lockVersion = lockVersion;
|
|
565
|
-
this.expressionMap.lockTables = lockTables;
|
|
566
|
-
return this;
|
|
567
|
-
}
|
|
568
|
-
/**
|
|
569
|
-
* Sets lock handling by adding NO WAIT or SKIP LOCKED.
|
|
570
|
-
*/
|
|
571
|
-
setOnLocked(onLocked) {
|
|
572
|
-
this.expressionMap.onLocked = onLocked;
|
|
573
|
-
return this;
|
|
574
|
-
}
|
|
575
|
-
/**
|
|
576
|
-
* Disables the global condition of "non-deleted" for the entity with delete date columns.
|
|
577
|
-
*/
|
|
578
|
-
withDeleted() {
|
|
579
|
-
this.expressionMap.withDeleted = true;
|
|
580
|
-
return this;
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
* Gets first raw result returned by execution of generated query builder sql.
|
|
584
|
-
*/
|
|
585
|
-
async getRawOne() {
|
|
586
|
-
return (await this.getRawMany())[0];
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* Gets all raw results returned by execution of generated query builder sql.
|
|
590
|
-
*/
|
|
591
|
-
async getRawMany() {
|
|
592
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
593
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
594
|
-
this.expressionMap.queryEntity = false;
|
|
595
|
-
const queryRunner = this.obtainQueryRunner();
|
|
596
|
-
let transactionStartedByUs = false;
|
|
597
|
-
try {
|
|
598
|
-
if (this.expressionMap.useTransaction === true &&
|
|
599
|
-
queryRunner.isTransactionActive === false) {
|
|
600
|
-
await queryRunner.startTransaction();
|
|
601
|
-
transactionStartedByUs = true;
|
|
602
|
-
}
|
|
603
|
-
const results = await this.loadRawResults(queryRunner);
|
|
604
|
-
if (transactionStartedByUs) {
|
|
605
|
-
await queryRunner.commitTransaction();
|
|
606
|
-
}
|
|
607
|
-
return results;
|
|
608
|
-
}
|
|
609
|
-
catch (error) {
|
|
610
|
-
if (transactionStartedByUs) {
|
|
611
|
-
try {
|
|
612
|
-
await queryRunner.rollbackTransaction();
|
|
613
|
-
}
|
|
614
|
-
catch (rollbackError) { }
|
|
615
|
-
}
|
|
616
|
-
throw error;
|
|
617
|
-
}
|
|
618
|
-
finally {
|
|
619
|
-
if (queryRunner !== this.queryRunner) {
|
|
620
|
-
await queryRunner.release();
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
/**
|
|
625
|
-
* Executes sql generated by query builder and returns object with raw results and entities created from them.
|
|
626
|
-
*/
|
|
627
|
-
async getRawAndEntities() {
|
|
628
|
-
const queryRunner = this.obtainQueryRunner();
|
|
629
|
-
let transactionStartedByUs = false;
|
|
630
|
-
try {
|
|
631
|
-
if (this.expressionMap.useTransaction === true &&
|
|
632
|
-
queryRunner.isTransactionActive === false) {
|
|
633
|
-
await queryRunner.startTransaction();
|
|
634
|
-
transactionStartedByUs = true;
|
|
635
|
-
}
|
|
636
|
-
this.expressionMap.queryEntity = true;
|
|
637
|
-
const results = await this.executeEntitiesAndRawResults(queryRunner);
|
|
638
|
-
if (transactionStartedByUs) {
|
|
639
|
-
await queryRunner.commitTransaction();
|
|
640
|
-
}
|
|
641
|
-
return results;
|
|
642
|
-
}
|
|
643
|
-
catch (error) {
|
|
644
|
-
if (transactionStartedByUs) {
|
|
645
|
-
try {
|
|
646
|
-
await queryRunner.rollbackTransaction();
|
|
647
|
-
}
|
|
648
|
-
catch (rollbackError) { }
|
|
649
|
-
}
|
|
650
|
-
throw error;
|
|
651
|
-
}
|
|
652
|
-
finally {
|
|
653
|
-
if (queryRunner !== this.queryRunner)
|
|
654
|
-
await queryRunner.release();
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Gets single entity returned by execution of generated query builder sql.
|
|
659
|
-
*/
|
|
660
|
-
async getOne() {
|
|
661
|
-
const results = await this.getRawAndEntities();
|
|
662
|
-
const result = results.entities[0];
|
|
663
|
-
if (result &&
|
|
664
|
-
this.expressionMap.lockMode === "optimistic" &&
|
|
665
|
-
this.expressionMap.lockVersion) {
|
|
666
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
667
|
-
if (this.expressionMap.lockVersion instanceof Date) {
|
|
668
|
-
const actualVersion = metadata.updateDateColumn.getEntityValue(result); // what if columns arent set?
|
|
669
|
-
if (actualVersion.getTime() !==
|
|
670
|
-
this.expressionMap.lockVersion.getTime())
|
|
671
|
-
throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
const actualVersion = metadata.versionColumn.getEntityValue(result); // what if columns arent set?
|
|
675
|
-
if (actualVersion !== this.expressionMap.lockVersion)
|
|
676
|
-
throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
if (result === undefined) {
|
|
680
|
-
return null;
|
|
681
|
-
}
|
|
682
|
-
return result;
|
|
683
|
-
}
|
|
684
|
-
/**
|
|
685
|
-
* Gets the first entity returned by execution of generated query builder sql or rejects the returned promise on error.
|
|
686
|
-
*/
|
|
687
|
-
async getOneOrFail() {
|
|
688
|
-
const entity = await this.getOne();
|
|
689
|
-
if (!entity) {
|
|
690
|
-
throw new EntityNotFoundError(this.expressionMap.mainAlias.target, this);
|
|
691
|
-
}
|
|
692
|
-
return entity;
|
|
693
|
-
}
|
|
694
|
-
/**
|
|
695
|
-
* Gets entities returned by execution of generated query builder sql.
|
|
696
|
-
*/
|
|
697
|
-
async getMany() {
|
|
698
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
699
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
700
|
-
const results = await this.getRawAndEntities();
|
|
701
|
-
return results.entities;
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Gets count - number of entities selected by sql generated by this query builder.
|
|
705
|
-
* Count excludes all limitations set by setFirstResult and setMaxResults methods call.
|
|
706
|
-
*/
|
|
707
|
-
async getCount() {
|
|
708
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
709
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
710
|
-
const queryRunner = this.obtainQueryRunner();
|
|
711
|
-
let transactionStartedByUs = false;
|
|
712
|
-
try {
|
|
713
|
-
if (this.expressionMap.useTransaction === true &&
|
|
714
|
-
queryRunner.isTransactionActive === false) {
|
|
715
|
-
await queryRunner.startTransaction();
|
|
716
|
-
transactionStartedByUs = true;
|
|
717
|
-
}
|
|
718
|
-
this.expressionMap.queryEntity = false;
|
|
719
|
-
const results = await this.executeCountQuery(queryRunner);
|
|
720
|
-
if (transactionStartedByUs) {
|
|
721
|
-
await queryRunner.commitTransaction();
|
|
722
|
-
}
|
|
723
|
-
return results;
|
|
724
|
-
}
|
|
725
|
-
catch (error) {
|
|
726
|
-
if (transactionStartedByUs) {
|
|
727
|
-
try {
|
|
728
|
-
await queryRunner.rollbackTransaction();
|
|
729
|
-
}
|
|
730
|
-
catch (rollbackError) { }
|
|
731
|
-
}
|
|
732
|
-
throw error;
|
|
733
|
-
}
|
|
734
|
-
finally {
|
|
735
|
-
if (queryRunner !== this.queryRunner)
|
|
736
|
-
await queryRunner.release();
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
/**
|
|
740
|
-
* Executes built SQL query and returns entities and overall entities count (without limitation).
|
|
741
|
-
* This method is useful to build pagination.
|
|
742
|
-
*/
|
|
743
|
-
async getManyAndCount() {
|
|
744
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
745
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
746
|
-
const queryRunner = this.obtainQueryRunner();
|
|
747
|
-
let transactionStartedByUs = false;
|
|
748
|
-
try {
|
|
749
|
-
if (this.expressionMap.useTransaction === true &&
|
|
750
|
-
queryRunner.isTransactionActive === false) {
|
|
751
|
-
await queryRunner.startTransaction();
|
|
752
|
-
transactionStartedByUs = true;
|
|
753
|
-
}
|
|
754
|
-
this.expressionMap.queryEntity = true;
|
|
755
|
-
const entitiesAndRaw = await this.executeEntitiesAndRawResults(queryRunner);
|
|
756
|
-
this.expressionMap.queryEntity = false;
|
|
757
|
-
const cacheId = this.expressionMap.cacheId;
|
|
758
|
-
this.expressionMap.cacheId = cacheId ? `${cacheId}-count` : cacheId;
|
|
759
|
-
const count = await this.executeCountQuery(queryRunner);
|
|
760
|
-
const results = [entitiesAndRaw.entities, count];
|
|
761
|
-
if (transactionStartedByUs) {
|
|
762
|
-
await queryRunner.commitTransaction();
|
|
763
|
-
}
|
|
764
|
-
return results;
|
|
765
|
-
}
|
|
766
|
-
catch (error) {
|
|
767
|
-
if (transactionStartedByUs) {
|
|
768
|
-
try {
|
|
769
|
-
await queryRunner.rollbackTransaction();
|
|
770
|
-
}
|
|
771
|
-
catch (rollbackError) { }
|
|
772
|
-
}
|
|
773
|
-
throw error;
|
|
774
|
-
}
|
|
775
|
-
finally {
|
|
776
|
-
if (queryRunner !== this.queryRunner)
|
|
777
|
-
await queryRunner.release();
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
/**
|
|
781
|
-
* Enables or disables query result caching.
|
|
782
|
-
*/
|
|
783
|
-
cache(enabledOrMillisecondsOrId, maybeMilliseconds) {
|
|
784
|
-
if (typeof enabledOrMillisecondsOrId === "boolean") {
|
|
785
|
-
this.expressionMap.cache = enabledOrMillisecondsOrId;
|
|
786
|
-
}
|
|
787
|
-
else if (typeof enabledOrMillisecondsOrId === "number") {
|
|
788
|
-
this.expressionMap.cache = true;
|
|
789
|
-
this.expressionMap.cacheDuration = enabledOrMillisecondsOrId;
|
|
790
|
-
}
|
|
791
|
-
else if (typeof enabledOrMillisecondsOrId === "string" ||
|
|
792
|
-
typeof enabledOrMillisecondsOrId === "number") {
|
|
793
|
-
this.expressionMap.cache = true;
|
|
794
|
-
this.expressionMap.cacheId = enabledOrMillisecondsOrId;
|
|
795
|
-
}
|
|
796
|
-
if (maybeMilliseconds) {
|
|
797
|
-
this.expressionMap.cacheDuration = maybeMilliseconds;
|
|
798
|
-
}
|
|
799
|
-
return this;
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Sets extra options that can be used to configure how query builder works.
|
|
803
|
-
*/
|
|
804
|
-
setOption(option) {
|
|
805
|
-
this.expressionMap.options.push(option);
|
|
806
|
-
return this;
|
|
807
|
-
}
|
|
808
|
-
join(direction, entityOrProperty, aliasName, condition, parameters, mapToProperty, isMappingMany) {
|
|
809
|
-
this.setParameters(parameters || {});
|
|
810
|
-
const joinAttribute = new JoinAttribute(this.connection, this.expressionMap);
|
|
811
|
-
joinAttribute.direction = direction;
|
|
812
|
-
joinAttribute.mapToProperty = mapToProperty;
|
|
813
|
-
joinAttribute.isMappingMany = isMappingMany;
|
|
814
|
-
joinAttribute.entityOrProperty = entityOrProperty; // relationName
|
|
815
|
-
joinAttribute.condition = condition ? condition : undefined; // joinInverseSideCondition
|
|
816
|
-
this.expressionMap.joinAttributes.push(joinAttribute);
|
|
817
|
-
if (joinAttribute.metadata) {
|
|
818
|
-
if (joinAttribute.metadata.deleteDateColumn &&
|
|
819
|
-
!this.expressionMap.withDeleted) {
|
|
820
|
-
const conditionDeleteColumn = `${aliasName}.${joinAttribute.metadata.deleteDateColumn.propertyName} IS NULL`;
|
|
821
|
-
joinAttribute.condition = joinAttribute.condition
|
|
822
|
-
? ` ${joinAttribute.condition} AND ${conditionDeleteColumn}`
|
|
823
|
-
: `${conditionDeleteColumn}`;
|
|
824
|
-
}
|
|
825
|
-
joinAttribute.alias = this.expressionMap.createAlias({
|
|
826
|
-
type: "join",
|
|
827
|
-
name: aliasName,
|
|
828
|
-
metadata: joinAttribute.metadata,
|
|
829
|
-
});
|
|
830
|
-
if (joinAttribute.relation &&
|
|
831
|
-
joinAttribute.relation.junctionEntityMetadata) {
|
|
832
|
-
this.expressionMap.createAlias({
|
|
833
|
-
type: "join",
|
|
834
|
-
name: joinAttribute.junctionAlias,
|
|
835
|
-
metadata: joinAttribute.relation.junctionEntityMetadata,
|
|
836
|
-
});
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
else {
|
|
840
|
-
let subQuery = "";
|
|
841
|
-
if (typeof entityOrProperty === "function") {
|
|
842
|
-
const subQueryBuilder = entityOrProperty(this.subQuery());
|
|
843
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
844
|
-
subQuery = subQueryBuilder.getQuery();
|
|
845
|
-
}
|
|
846
|
-
else {
|
|
847
|
-
subQuery = entityOrProperty;
|
|
848
|
-
}
|
|
849
|
-
const isSubQuery = typeof entityOrProperty === "function" ||
|
|
850
|
-
(entityOrProperty.substr(0, 1) === "(" &&
|
|
851
|
-
entityOrProperty.substr(-1) === ")");
|
|
852
|
-
joinAttribute.alias = this.expressionMap.createAlias({
|
|
853
|
-
type: "join",
|
|
854
|
-
name: aliasName,
|
|
855
|
-
tablePath: isSubQuery === false
|
|
856
|
-
? entityOrProperty
|
|
857
|
-
: undefined,
|
|
858
|
-
subQuery: isSubQuery === true ? subQuery : undefined,
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
/**
|
|
863
|
-
* Creates "SELECT FROM" part of SQL query.
|
|
864
|
-
*/
|
|
865
|
-
createSelectExpression() {
|
|
866
|
-
if (!this.expressionMap.mainAlias)
|
|
867
|
-
throw new TypeORMError("Cannot build query because main alias is not set (call qb#from method)");
|
|
868
|
-
const allSelects = [];
|
|
869
|
-
const excludedSelects = [];
|
|
870
|
-
if (this.expressionMap.mainAlias.hasMetadata) {
|
|
871
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
872
|
-
allSelects.push(...this.buildEscapedEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
|
|
873
|
-
excludedSelects.push(...this.findEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
|
|
874
|
-
}
|
|
875
|
-
this.expressionMap.joinAttributes.forEach((join) => {
|
|
876
|
-
if (join.metadata) {
|
|
877
|
-
allSelects.push(...this.buildEscapedEntityColumnSelects(join.alias.name, join.metadata));
|
|
878
|
-
excludedSelects.push(...this.findEntityColumnSelects(join.alias.name, join.metadata));
|
|
879
|
-
}
|
|
880
|
-
else {
|
|
881
|
-
const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === join.alias.name);
|
|
882
|
-
if (hasMainAlias) {
|
|
883
|
-
allSelects.push({
|
|
884
|
-
selection: this.escape(join.alias.name) + ".*",
|
|
885
|
-
});
|
|
886
|
-
const excludedSelect = this.expressionMap.selects.find((select) => select.selection === join.alias.name);
|
|
887
|
-
excludedSelects.push(excludedSelect);
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
this.expressionMap.selects
|
|
892
|
-
.filter((select) => excludedSelects.indexOf(select) === -1)
|
|
893
|
-
.forEach((select) => allSelects.push({
|
|
894
|
-
selection: this.replacePropertyNames(select.selection),
|
|
895
|
-
aliasName: select.aliasName,
|
|
896
|
-
}));
|
|
897
|
-
if (allSelects.length === 0)
|
|
898
|
-
allSelects.push({ selection: "*" });
|
|
899
|
-
let useIndex = "";
|
|
900
|
-
if (this.expressionMap.useIndex) {
|
|
901
|
-
if (DriverUtils.isMySQLFamily(this.connection.driver)) {
|
|
902
|
-
useIndex = ` USE INDEX (${this.expressionMap.useIndex})`;
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
const froms = this.expressionMap.aliases
|
|
906
|
-
.filter((alias) => alias.type === "from" &&
|
|
907
|
-
(alias.tablePath || alias.subQuery))
|
|
908
|
-
.map((alias) => {
|
|
909
|
-
if (alias.subQuery)
|
|
910
|
-
return alias.subQuery + " " + this.escape(alias.name);
|
|
911
|
-
return (this.getTableName(alias.tablePath) +
|
|
912
|
-
" " +
|
|
913
|
-
this.escape(alias.name));
|
|
914
|
-
});
|
|
915
|
-
const select = this.createSelectDistinctExpression();
|
|
916
|
-
const selection = allSelects
|
|
917
|
-
.map((select) => select.selection +
|
|
918
|
-
(select.aliasName
|
|
919
|
-
? " AS " + this.escape(select.aliasName)
|
|
920
|
-
: ""))
|
|
921
|
-
.join(", ");
|
|
922
|
-
return (select +
|
|
923
|
-
selection +
|
|
924
|
-
" FROM " +
|
|
925
|
-
froms.join(", ") +
|
|
926
|
-
this.createTableLockExpression() +
|
|
927
|
-
useIndex);
|
|
928
|
-
}
|
|
929
|
-
/**
|
|
930
|
-
* Creates select | select distinct part of SQL query.
|
|
931
|
-
*/
|
|
932
|
-
createSelectDistinctExpression() {
|
|
933
|
-
const { selectDistinct, selectDistinctOn, maxExecutionTime } = this.expressionMap;
|
|
934
|
-
const { driver } = this.connection;
|
|
935
|
-
let select = "SELECT ";
|
|
936
|
-
if (maxExecutionTime > 0) {
|
|
937
|
-
if (DriverUtils.isMySQLFamily(driver)) {
|
|
938
|
-
select += `/*+ MAX_EXECUTION_TIME(${this.expressionMap.maxExecutionTime}) */ `;
|
|
939
|
-
}
|
|
940
|
-
}
|
|
941
|
-
if (DriverUtils.isPostgresFamily(driver) &&
|
|
942
|
-
selectDistinctOn.length > 0) {
|
|
943
|
-
const selectDistinctOnMap = selectDistinctOn
|
|
944
|
-
.map((on) => this.replacePropertyNames(on))
|
|
945
|
-
.join(", ");
|
|
946
|
-
select = `SELECT DISTINCT ON (${selectDistinctOnMap}) `;
|
|
947
|
-
}
|
|
948
|
-
else if (selectDistinct) {
|
|
949
|
-
select = "SELECT DISTINCT ";
|
|
950
|
-
}
|
|
951
|
-
return select;
|
|
952
|
-
}
|
|
953
|
-
/**
|
|
954
|
-
* Creates "JOIN" part of SQL query.
|
|
955
|
-
*/
|
|
956
|
-
createJoinExpression() {
|
|
957
|
-
const joins = this.expressionMap.joinAttributes.map((joinAttr) => {
|
|
958
|
-
const relation = joinAttr.relation;
|
|
959
|
-
const destinationTableName = joinAttr.tablePath;
|
|
960
|
-
const destinationTableAlias = joinAttr.alias.name;
|
|
961
|
-
let appendedCondition = joinAttr.condition
|
|
962
|
-
? " AND (" + joinAttr.condition + ")"
|
|
963
|
-
: "";
|
|
964
|
-
const parentAlias = joinAttr.parentAlias;
|
|
965
|
-
if (!parentAlias || !relation) {
|
|
966
|
-
const destinationJoin = joinAttr.alias.subQuery
|
|
967
|
-
? joinAttr.alias.subQuery
|
|
968
|
-
: this.getTableName(destinationTableName);
|
|
969
|
-
return (" " +
|
|
970
|
-
joinAttr.direction +
|
|
971
|
-
" JOIN " +
|
|
972
|
-
destinationJoin +
|
|
973
|
-
" " +
|
|
974
|
-
this.escape(destinationTableAlias) +
|
|
975
|
-
this.createTableLockExpression() +
|
|
976
|
-
(joinAttr.condition
|
|
977
|
-
? " ON " + this.replacePropertyNames(joinAttr.condition)
|
|
978
|
-
: ""));
|
|
979
|
-
}
|
|
980
|
-
if (relation.isManyToOne || relation.isOneToOneOwner) {
|
|
981
|
-
const condition = relation.joinColumns
|
|
982
|
-
.map((joinColumn) => {
|
|
983
|
-
return (destinationTableAlias +
|
|
984
|
-
"." +
|
|
985
|
-
joinColumn.referencedColumn.propertyPath +
|
|
986
|
-
"=" +
|
|
987
|
-
parentAlias +
|
|
988
|
-
"." +
|
|
989
|
-
relation.propertyPath +
|
|
990
|
-
"." +
|
|
991
|
-
joinColumn.referencedColumn.propertyPath);
|
|
992
|
-
})
|
|
993
|
-
.join(" AND ");
|
|
994
|
-
return (" " +
|
|
995
|
-
joinAttr.direction +
|
|
996
|
-
" JOIN " +
|
|
997
|
-
this.getTableName(destinationTableName) +
|
|
998
|
-
" " +
|
|
999
|
-
this.escape(destinationTableAlias) +
|
|
1000
|
-
this.createTableLockExpression() +
|
|
1001
|
-
" ON " +
|
|
1002
|
-
this.replacePropertyNames(condition + appendedCondition));
|
|
1003
|
-
}
|
|
1004
|
-
else if (relation.isOneToMany || relation.isOneToOneNotOwner) {
|
|
1005
|
-
const condition = relation
|
|
1006
|
-
.inverseRelation.joinColumns.map((joinColumn) => {
|
|
1007
|
-
if (relation.inverseEntityMetadata.tableType ===
|
|
1008
|
-
"entity-child" &&
|
|
1009
|
-
relation.inverseEntityMetadata.discriminatorColumn) {
|
|
1010
|
-
appendedCondition +=
|
|
1011
|
-
" AND " +
|
|
1012
|
-
destinationTableAlias +
|
|
1013
|
-
"." +
|
|
1014
|
-
relation.inverseEntityMetadata
|
|
1015
|
-
.discriminatorColumn.databaseName +
|
|
1016
|
-
"='" +
|
|
1017
|
-
relation.inverseEntityMetadata
|
|
1018
|
-
.discriminatorValue +
|
|
1019
|
-
"'";
|
|
1020
|
-
}
|
|
1021
|
-
return (destinationTableAlias +
|
|
1022
|
-
"." +
|
|
1023
|
-
relation.inverseRelation.propertyPath +
|
|
1024
|
-
"." +
|
|
1025
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1026
|
-
"=" +
|
|
1027
|
-
parentAlias +
|
|
1028
|
-
"." +
|
|
1029
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1030
|
-
})
|
|
1031
|
-
.join(" AND ");
|
|
1032
|
-
return (" " +
|
|
1033
|
-
joinAttr.direction +
|
|
1034
|
-
" JOIN " +
|
|
1035
|
-
this.getTableName(destinationTableName) +
|
|
1036
|
-
" " +
|
|
1037
|
-
this.escape(destinationTableAlias) +
|
|
1038
|
-
this.createTableLockExpression() +
|
|
1039
|
-
" ON " +
|
|
1040
|
-
this.replacePropertyNames(condition + appendedCondition));
|
|
1041
|
-
}
|
|
1042
|
-
else {
|
|
1043
|
-
const junctionTableName = relation.junctionEntityMetadata.tablePath;
|
|
1044
|
-
const junctionAlias = joinAttr.junctionAlias;
|
|
1045
|
-
let junctionCondition = "", destinationCondition = "";
|
|
1046
|
-
if (relation.isOwning) {
|
|
1047
|
-
junctionCondition = relation.joinColumns
|
|
1048
|
-
.map((joinColumn) => {
|
|
1049
|
-
return (junctionAlias +
|
|
1050
|
-
"." +
|
|
1051
|
-
joinColumn.propertyPath +
|
|
1052
|
-
"=" +
|
|
1053
|
-
parentAlias +
|
|
1054
|
-
"." +
|
|
1055
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1056
|
-
})
|
|
1057
|
-
.join(" AND ");
|
|
1058
|
-
destinationCondition = relation.inverseJoinColumns
|
|
1059
|
-
.map((joinColumn) => {
|
|
1060
|
-
return (destinationTableAlias +
|
|
1061
|
-
"." +
|
|
1062
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1063
|
-
"=" +
|
|
1064
|
-
junctionAlias +
|
|
1065
|
-
"." +
|
|
1066
|
-
joinColumn.propertyPath);
|
|
1067
|
-
})
|
|
1068
|
-
.join(" AND ");
|
|
1069
|
-
}
|
|
1070
|
-
else {
|
|
1071
|
-
junctionCondition = relation
|
|
1072
|
-
.inverseRelation.inverseJoinColumns.map((joinColumn) => {
|
|
1073
|
-
return (junctionAlias +
|
|
1074
|
-
"." +
|
|
1075
|
-
joinColumn.propertyPath +
|
|
1076
|
-
"=" +
|
|
1077
|
-
parentAlias +
|
|
1078
|
-
"." +
|
|
1079
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1080
|
-
})
|
|
1081
|
-
.join(" AND ");
|
|
1082
|
-
destinationCondition = relation
|
|
1083
|
-
.inverseRelation.joinColumns.map((joinColumn) => {
|
|
1084
|
-
return (destinationTableAlias +
|
|
1085
|
-
"." +
|
|
1086
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1087
|
-
"=" +
|
|
1088
|
-
junctionAlias +
|
|
1089
|
-
"." +
|
|
1090
|
-
joinColumn.propertyPath);
|
|
1091
|
-
})
|
|
1092
|
-
.join(" AND ");
|
|
1093
|
-
}
|
|
1094
|
-
return (" " +
|
|
1095
|
-
joinAttr.direction +
|
|
1096
|
-
" JOIN " +
|
|
1097
|
-
this.getTableName(junctionTableName) +
|
|
1098
|
-
" " +
|
|
1099
|
-
this.escape(junctionAlias) +
|
|
1100
|
-
this.createTableLockExpression() +
|
|
1101
|
-
" ON " +
|
|
1102
|
-
this.replacePropertyNames(junctionCondition) +
|
|
1103
|
-
" " +
|
|
1104
|
-
joinAttr.direction +
|
|
1105
|
-
" JOIN " +
|
|
1106
|
-
this.getTableName(destinationTableName) +
|
|
1107
|
-
" " +
|
|
1108
|
-
this.escape(destinationTableAlias) +
|
|
1109
|
-
this.createTableLockExpression() +
|
|
1110
|
-
" ON " +
|
|
1111
|
-
this.replacePropertyNames(destinationCondition + appendedCondition));
|
|
1112
|
-
}
|
|
1113
|
-
});
|
|
1114
|
-
return joins.join(" ");
|
|
1115
|
-
}
|
|
1116
|
-
/**
|
|
1117
|
-
* Creates "GROUP BY" part of SQL query.
|
|
1118
|
-
*/
|
|
1119
|
-
createGroupByExpression() {
|
|
1120
|
-
if (!this.expressionMap.groupBys || !this.expressionMap.groupBys.length)
|
|
1121
|
-
return "";
|
|
1122
|
-
return (" GROUP BY " +
|
|
1123
|
-
this.replacePropertyNames(this.expressionMap.groupBys.join(", ")));
|
|
1124
|
-
}
|
|
1125
|
-
/**
|
|
1126
|
-
* Creates "ORDER BY" part of SQL query.
|
|
1127
|
-
*/
|
|
1128
|
-
createOrderByExpression() {
|
|
1129
|
-
const orderBys = this.expressionMap.allOrderBys;
|
|
1130
|
-
if (Object.keys(orderBys).length > 0)
|
|
1131
|
-
return (" ORDER BY " +
|
|
1132
|
-
Object.keys(orderBys)
|
|
1133
|
-
.map((columnName) => {
|
|
1134
|
-
if (typeof orderBys[columnName] === "string") {
|
|
1135
|
-
return (this.replacePropertyNames(columnName) +
|
|
1136
|
-
" " +
|
|
1137
|
-
orderBys[columnName]);
|
|
1138
|
-
}
|
|
1139
|
-
else {
|
|
1140
|
-
return (this.replacePropertyNames(columnName) +
|
|
1141
|
-
" " +
|
|
1142
|
-
orderBys[columnName].order +
|
|
1143
|
-
" " +
|
|
1144
|
-
orderBys[columnName].nulls);
|
|
1145
|
-
}
|
|
1146
|
-
})
|
|
1147
|
-
.join(", "));
|
|
1148
|
-
return "";
|
|
1149
|
-
}
|
|
1150
|
-
/**
|
|
1151
|
-
* Creates "LIMIT" and "OFFSET" parts of SQL query.
|
|
1152
|
-
*/
|
|
1153
|
-
createLimitOffsetExpression() {
|
|
1154
|
-
let offset = this.expressionMap.offset, limit = this.expressionMap.limit;
|
|
1155
|
-
if (!offset &&
|
|
1156
|
-
!limit &&
|
|
1157
|
-
this.expressionMap.joinAttributes.length === 0) {
|
|
1158
|
-
offset = this.expressionMap.skip;
|
|
1159
|
-
limit = this.expressionMap.take;
|
|
1160
|
-
}
|
|
1161
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1162
|
-
let prefix = "";
|
|
1163
|
-
if ((limit || offset) &&
|
|
1164
|
-
Object.keys(this.expressionMap.allOrderBys).length <= 0) {
|
|
1165
|
-
prefix = " ORDER BY (SELECT NULL)";
|
|
1166
|
-
}
|
|
1167
|
-
if (limit && offset)
|
|
1168
|
-
return (prefix +
|
|
1169
|
-
" OFFSET " +
|
|
1170
|
-
offset +
|
|
1171
|
-
" ROWS FETCH NEXT " +
|
|
1172
|
-
limit +
|
|
1173
|
-
" ROWS ONLY");
|
|
1174
|
-
if (limit)
|
|
1175
|
-
return (prefix + " OFFSET 0 ROWS FETCH NEXT " + limit + " ROWS ONLY");
|
|
1176
|
-
if (offset)
|
|
1177
|
-
return prefix + " OFFSET " + offset + " ROWS";
|
|
1178
|
-
}
|
|
1179
|
-
else if (DriverUtils.isMySQLFamily(this.connection.driver) ||
|
|
1180
|
-
this.connection.driver.options.type === "aurora-mysql" ||
|
|
1181
|
-
this.connection.driver.options.type === "sap" ||
|
|
1182
|
-
this.connection.driver.options.type === "spanner") {
|
|
1183
|
-
if (limit && offset)
|
|
1184
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1185
|
-
if (limit)
|
|
1186
|
-
return " LIMIT " + limit;
|
|
1187
|
-
if (offset)
|
|
1188
|
-
throw new OffsetWithoutLimitNotSupportedError();
|
|
1189
|
-
}
|
|
1190
|
-
else if (DriverUtils.isSQLiteFamily(this.connection.driver)) {
|
|
1191
|
-
if (limit && offset)
|
|
1192
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1193
|
-
if (limit)
|
|
1194
|
-
return " LIMIT " + limit;
|
|
1195
|
-
if (offset)
|
|
1196
|
-
return " LIMIT -1 OFFSET " + offset;
|
|
1197
|
-
}
|
|
1198
|
-
else if (this.connection.driver.options.type === "oracle") {
|
|
1199
|
-
if (limit && offset)
|
|
1200
|
-
return (" OFFSET " +
|
|
1201
|
-
offset +
|
|
1202
|
-
" ROWS FETCH NEXT " +
|
|
1203
|
-
limit +
|
|
1204
|
-
" ROWS ONLY");
|
|
1205
|
-
if (limit)
|
|
1206
|
-
return " FETCH NEXT " + limit + " ROWS ONLY";
|
|
1207
|
-
if (offset)
|
|
1208
|
-
return " OFFSET " + offset + " ROWS";
|
|
1209
|
-
}
|
|
1210
|
-
else {
|
|
1211
|
-
if (limit && offset)
|
|
1212
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1213
|
-
if (limit)
|
|
1214
|
-
return " LIMIT " + limit;
|
|
1215
|
-
if (offset)
|
|
1216
|
-
return " OFFSET " + offset;
|
|
1217
|
-
}
|
|
1218
|
-
return "";
|
|
1219
|
-
}
|
|
1220
|
-
/**
|
|
1221
|
-
* Creates "LOCK" part of SELECT Query after table Clause
|
|
1222
|
-
* ex.
|
|
1223
|
-
* SELECT 1
|
|
1224
|
-
* FROM USER U WITH (NOLOCK)
|
|
1225
|
-
* JOIN ORDER O WITH (NOLOCK)
|
|
1226
|
-
* ON U.ID=O.OrderID
|
|
1227
|
-
*/
|
|
1228
|
-
createTableLockExpression() {
|
|
1229
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1230
|
-
switch (this.expressionMap.lockMode) {
|
|
1231
|
-
case "pessimistic_read":
|
|
1232
|
-
return " WITH (HOLDLOCK, ROWLOCK)";
|
|
1233
|
-
case "pessimistic_write":
|
|
1234
|
-
return " WITH (UPDLOCK, ROWLOCK)";
|
|
1235
|
-
case "dirty_read":
|
|
1236
|
-
return " WITH (NOLOCK)";
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
return "";
|
|
1240
|
-
}
|
|
1241
|
-
/**
|
|
1242
|
-
* Creates "LOCK" part of SQL query.
|
|
1243
|
-
*/
|
|
1244
|
-
createLockExpression() {
|
|
1245
|
-
const driver = this.connection.driver;
|
|
1246
|
-
let lockTablesClause = "";
|
|
1247
|
-
if (this.expressionMap.lockTables) {
|
|
1248
|
-
if (!(DriverUtils.isPostgresFamily(driver) ||
|
|
1249
|
-
driver.options.type === "cockroachdb")) {
|
|
1250
|
-
throw new TypeORMError("Lock tables not supported in selected driver");
|
|
1251
|
-
}
|
|
1252
|
-
if (this.expressionMap.lockTables.length < 1) {
|
|
1253
|
-
throw new TypeORMError("lockTables cannot be an empty array");
|
|
1254
|
-
}
|
|
1255
|
-
lockTablesClause = " OF " + this.expressionMap.lockTables.join(", ");
|
|
1256
|
-
}
|
|
1257
|
-
let onLockExpression = "";
|
|
1258
|
-
if (this.expressionMap.onLocked === "nowait") {
|
|
1259
|
-
onLockExpression = " NOWAIT";
|
|
1260
|
-
}
|
|
1261
|
-
else if (this.expressionMap.onLocked === "skip_locked") {
|
|
1262
|
-
onLockExpression = " SKIP LOCKED";
|
|
1263
|
-
}
|
|
1264
|
-
switch (this.expressionMap.lockMode) {
|
|
1265
|
-
case "pessimistic_read":
|
|
1266
|
-
if (driver.options.type === "mysql" ||
|
|
1267
|
-
driver.options.type === "aurora-mysql") {
|
|
1268
|
-
if (DriverUtils.isReleaseVersionOrGreater(driver, "8.0.0")) {
|
|
1269
|
-
return (" FOR SHARE" + lockTablesClause + onLockExpression);
|
|
1270
|
-
}
|
|
1271
|
-
else {
|
|
1272
|
-
return " LOCK IN SHARE MODE";
|
|
1273
|
-
}
|
|
1274
|
-
}
|
|
1275
|
-
else if (driver.options.type === "mariadb") {
|
|
1276
|
-
return " LOCK IN SHARE MODE";
|
|
1277
|
-
}
|
|
1278
|
-
else if (DriverUtils.isPostgresFamily(driver)) {
|
|
1279
|
-
return " FOR SHARE" + lockTablesClause + onLockExpression;
|
|
1280
|
-
}
|
|
1281
|
-
else if (driver.options.type === "oracle") {
|
|
1282
|
-
return " FOR UPDATE";
|
|
1283
|
-
}
|
|
1284
|
-
else if (driver.options.type === "mssql") {
|
|
1285
|
-
return "";
|
|
1286
|
-
}
|
|
1287
|
-
else {
|
|
1288
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1289
|
-
}
|
|
1290
|
-
case "pessimistic_write":
|
|
1291
|
-
if (DriverUtils.isMySQLFamily(driver) ||
|
|
1292
|
-
driver.options.type === "aurora-mysql" ||
|
|
1293
|
-
driver.options.type === "oracle") {
|
|
1294
|
-
return " FOR UPDATE" + onLockExpression;
|
|
1295
|
-
}
|
|
1296
|
-
else if (DriverUtils.isPostgresFamily(driver) ||
|
|
1297
|
-
driver.options.type === "cockroachdb") {
|
|
1298
|
-
return " FOR UPDATE" + lockTablesClause + onLockExpression;
|
|
1299
|
-
}
|
|
1300
|
-
else if (driver.options.type === "mssql") {
|
|
1301
|
-
return "";
|
|
1302
|
-
}
|
|
1303
|
-
else {
|
|
1304
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1305
|
-
}
|
|
1306
|
-
case "pessimistic_partial_write":
|
|
1307
|
-
if (DriverUtils.isPostgresFamily(driver)) {
|
|
1308
|
-
return " FOR UPDATE" + lockTablesClause + " SKIP LOCKED";
|
|
1309
|
-
}
|
|
1310
|
-
else if (DriverUtils.isMySQLFamily(driver)) {
|
|
1311
|
-
return " FOR UPDATE SKIP LOCKED";
|
|
1312
|
-
}
|
|
1313
|
-
else {
|
|
1314
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1315
|
-
}
|
|
1316
|
-
case "pessimistic_write_or_fail":
|
|
1317
|
-
if (DriverUtils.isPostgresFamily(driver) ||
|
|
1318
|
-
driver.options.type === "cockroachdb") {
|
|
1319
|
-
return " FOR UPDATE" + lockTablesClause + " NOWAIT";
|
|
1320
|
-
}
|
|
1321
|
-
else if (DriverUtils.isMySQLFamily(driver)) {
|
|
1322
|
-
return " FOR UPDATE NOWAIT";
|
|
1323
|
-
}
|
|
1324
|
-
else {
|
|
1325
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1326
|
-
}
|
|
1327
|
-
case "for_no_key_update":
|
|
1328
|
-
if (DriverUtils.isPostgresFamily(driver) ||
|
|
1329
|
-
driver.options.type === "cockroachdb") {
|
|
1330
|
-
return (" FOR NO KEY UPDATE" +
|
|
1331
|
-
lockTablesClause +
|
|
1332
|
-
onLockExpression);
|
|
1333
|
-
}
|
|
1334
|
-
else {
|
|
1335
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1336
|
-
}
|
|
1337
|
-
case "for_key_share":
|
|
1338
|
-
if (DriverUtils.isPostgresFamily(driver)) {
|
|
1339
|
-
return (" FOR KEY SHARE" + lockTablesClause + onLockExpression);
|
|
1340
|
-
}
|
|
1341
|
-
else {
|
|
1342
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1343
|
-
}
|
|
1344
|
-
default:
|
|
1345
|
-
return "";
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
/**
|
|
1349
|
-
* Creates "HAVING" part of SQL query.
|
|
1350
|
-
*/
|
|
1351
|
-
createHavingExpression() {
|
|
1352
|
-
if (!this.expressionMap.havings || !this.expressionMap.havings.length)
|
|
1353
|
-
return "";
|
|
1354
|
-
const conditions = this.expressionMap.havings
|
|
1355
|
-
.map((having, index) => {
|
|
1356
|
-
switch (having.type) {
|
|
1357
|
-
case "and":
|
|
1358
|
-
return ((index > 0 ? "AND " : "") +
|
|
1359
|
-
this.replacePropertyNames(having.condition));
|
|
1360
|
-
case "or":
|
|
1361
|
-
return ((index > 0 ? "OR " : "") +
|
|
1362
|
-
this.replacePropertyNames(having.condition));
|
|
1363
|
-
default:
|
|
1364
|
-
return this.replacePropertyNames(having.condition);
|
|
1365
|
-
}
|
|
1366
|
-
})
|
|
1367
|
-
.join(" ");
|
|
1368
|
-
if (!conditions.length)
|
|
1369
|
-
return "";
|
|
1370
|
-
return " HAVING " + conditions;
|
|
1371
|
-
}
|
|
1372
|
-
buildEscapedEntityColumnSelects(aliasName, metadata) {
|
|
1373
|
-
const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === aliasName);
|
|
1374
|
-
const columns = [];
|
|
1375
|
-
if (hasMainAlias) {
|
|
1376
|
-
columns.push(...metadata.columns.filter((column) => column.isSelect === true));
|
|
1377
|
-
}
|
|
1378
|
-
columns.push(...metadata.columns.filter((column) => {
|
|
1379
|
-
return this.expressionMap.selects.some((select) => select.selection ===
|
|
1380
|
-
aliasName + "." + column.propertyPath);
|
|
1381
|
-
}));
|
|
1382
|
-
if (columns.length === 0)
|
|
1383
|
-
return [];
|
|
1384
|
-
const nonSelectedPrimaryColumns = this.expressionMap.queryEntity
|
|
1385
|
-
? metadata.primaryColumns.filter((primaryColumn) => columns.indexOf(primaryColumn) === -1)
|
|
1386
|
-
: [];
|
|
1387
|
-
const allColumns = [...columns, ...nonSelectedPrimaryColumns];
|
|
1388
|
-
const finalSelects = [];
|
|
1389
|
-
const escapedAliasName = this.escape(aliasName);
|
|
1390
|
-
allColumns.forEach((column) => {
|
|
1391
|
-
let selectionPath = escapedAliasName + "." + this.escape(column.databaseName);
|
|
1392
|
-
if (column.isVirtualProperty && column.query) {
|
|
1393
|
-
selectionPath = `(${column.query(escapedAliasName)})`;
|
|
1394
|
-
}
|
|
1395
|
-
if (this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
|
|
1396
|
-
/* */
|
|
1397
|
-
/* */
|
|
1398
|
-
/* */
|
|
1399
|
-
/* */
|
|
1400
|
-
/* */
|
|
1401
|
-
/* */
|
|
1402
|
-
/* */
|
|
1403
|
-
/* */
|
|
1404
|
-
/* */
|
|
1405
|
-
/* */
|
|
1406
|
-
/* */
|
|
1407
|
-
/* */
|
|
1408
|
-
/* */
|
|
1409
|
-
/* */
|
|
1410
|
-
/* */
|
|
1411
|
-
/* */
|
|
1412
|
-
/* */
|
|
1413
|
-
/* */
|
|
1414
|
-
/* */
|
|
1415
|
-
/* */
|
|
1416
|
-
/* */
|
|
1417
|
-
/* */
|
|
1418
|
-
/* */
|
|
1419
|
-
}
|
|
1420
|
-
const selections = this.expressionMap.selects.filter((select) => select.selection === aliasName + "." + column.propertyPath);
|
|
1421
|
-
if (selections.length) {
|
|
1422
|
-
selections.forEach((selection) => {
|
|
1423
|
-
finalSelects.push({
|
|
1424
|
-
selection: selectionPath,
|
|
1425
|
-
aliasName: selection.aliasName
|
|
1426
|
-
? selection.aliasName
|
|
1427
|
-
: DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
|
|
1428
|
-
virtual: selection.virtual,
|
|
1429
|
-
});
|
|
1430
|
-
});
|
|
1431
|
-
}
|
|
1432
|
-
else {
|
|
1433
|
-
finalSelects.push({
|
|
1434
|
-
selection: selectionPath,
|
|
1435
|
-
aliasName: DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
|
|
1436
|
-
virtual: hasMainAlias,
|
|
1437
|
-
});
|
|
1438
|
-
}
|
|
1439
|
-
});
|
|
1440
|
-
return finalSelects;
|
|
1441
|
-
}
|
|
1442
|
-
findEntityColumnSelects(aliasName, metadata) {
|
|
1443
|
-
const mainSelect = this.expressionMap.selects.find((select) => select.selection === aliasName);
|
|
1444
|
-
if (mainSelect)
|
|
1445
|
-
return [mainSelect];
|
|
1446
|
-
return this.expressionMap.selects.filter((select) => {
|
|
1447
|
-
return metadata.columns.some((column) => select.selection === aliasName + "." + column.propertyPath);
|
|
1448
|
-
});
|
|
1449
|
-
}
|
|
1450
|
-
computeCountExpression() {
|
|
1451
|
-
const mainAlias = this.expressionMap.mainAlias.name; // todo: will this work with "fromTableName"?
|
|
1452
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1453
|
-
const primaryColumns = metadata.primaryColumns;
|
|
1454
|
-
const distinctAlias = this.escape(mainAlias);
|
|
1455
|
-
if (this.expressionMap.joinAttributes.length === 0 &&
|
|
1456
|
-
this.expressionMap.relationIdAttributes.length === 0 &&
|
|
1457
|
-
this.expressionMap.relationCountAttributes.length === 0) {
|
|
1458
|
-
return "COUNT(1)";
|
|
1459
|
-
}
|
|
1460
|
-
if (this.connection.driver.options.type === "cockroachdb" ||
|
|
1461
|
-
DriverUtils.isPostgresFamily(this.connection.driver)) {
|
|
1462
|
-
return ("COUNT(DISTINCT(" +
|
|
1463
|
-
primaryColumns
|
|
1464
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1465
|
-
.join(", ") +
|
|
1466
|
-
"))");
|
|
1467
|
-
}
|
|
1468
|
-
if (DriverUtils.isMySQLFamily(this.connection.driver)) {
|
|
1469
|
-
return ("COUNT(DISTINCT " +
|
|
1470
|
-
primaryColumns
|
|
1471
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1472
|
-
.join(", ") +
|
|
1473
|
-
")");
|
|
1474
|
-
}
|
|
1475
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1476
|
-
const columnsExpression = primaryColumns
|
|
1477
|
-
.map((primaryColumn) => `${distinctAlias}.${this.escape(primaryColumn.databaseName)}`)
|
|
1478
|
-
.join(", '|;|', ");
|
|
1479
|
-
if (primaryColumns.length === 1) {
|
|
1480
|
-
return `COUNT(DISTINCT(${columnsExpression}))`;
|
|
1481
|
-
}
|
|
1482
|
-
return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
|
|
1483
|
-
}
|
|
1484
|
-
if (this.connection.driver.options.type === "spanner") {
|
|
1485
|
-
if (primaryColumns.length === 1) {
|
|
1486
|
-
return `COUNT(DISTINCT(${distinctAlias}.${this.escape(primaryColumns[0].databaseName)}))`;
|
|
1487
|
-
}
|
|
1488
|
-
const columnsExpression = primaryColumns
|
|
1489
|
-
.map((primaryColumn) => `CAST(${distinctAlias}.${this.escape(primaryColumn.databaseName)} AS STRING)`)
|
|
1490
|
-
.join(", '|;|', ");
|
|
1491
|
-
return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
|
|
1492
|
-
}
|
|
1493
|
-
return (`COUNT(DISTINCT(` +
|
|
1494
|
-
primaryColumns
|
|
1495
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1496
|
-
.join(" || '|;|' || ") +
|
|
1497
|
-
"))");
|
|
1498
|
-
}
|
|
1499
|
-
async executeCountQuery(queryRunner) {
|
|
1500
|
-
const countSql = this.computeCountExpression();
|
|
1501
|
-
const results = await this.clone()
|
|
1502
|
-
.orderBy()
|
|
1503
|
-
.groupBy()
|
|
1504
|
-
.offset(undefined)
|
|
1505
|
-
.limit(undefined)
|
|
1506
|
-
.skip(undefined)
|
|
1507
|
-
.take(undefined)
|
|
1508
|
-
.select(countSql, "cnt")
|
|
1509
|
-
.setOption("disable-global-order")
|
|
1510
|
-
.loadRawResults(queryRunner);
|
|
1511
|
-
if (!results || !results[0] || !results[0]["cnt"])
|
|
1512
|
-
return 0;
|
|
1513
|
-
return parseInt(results[0]["cnt"]);
|
|
1514
|
-
}
|
|
1515
|
-
applyFindOptions() {
|
|
1516
|
-
if (this.expressionMap.mainAlias.metadata) {
|
|
1517
|
-
if (this.findOptions.relationLoadStrategy) {
|
|
1518
|
-
this.expressionMap.relationLoadStrategy =
|
|
1519
|
-
this.findOptions.relationLoadStrategy;
|
|
1520
|
-
}
|
|
1521
|
-
if (this.findOptions.comment) {
|
|
1522
|
-
this.comment(this.findOptions.comment);
|
|
1523
|
-
}
|
|
1524
|
-
if (this.findOptions.withDeleted) {
|
|
1525
|
-
this.withDeleted();
|
|
1526
|
-
}
|
|
1527
|
-
if (this.findOptions.select) {
|
|
1528
|
-
const select = Array.isArray(this.findOptions.select)
|
|
1529
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
|
|
1530
|
-
: this.findOptions.select;
|
|
1531
|
-
this.buildSelect(select, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1532
|
-
}
|
|
1533
|
-
if (this.selects.length) {
|
|
1534
|
-
this.select(this.selects);
|
|
1535
|
-
}
|
|
1536
|
-
this.selects = [];
|
|
1537
|
-
if (this.findOptions.relations) {
|
|
1538
|
-
const relations = Array.isArray(this.findOptions.relations)
|
|
1539
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
|
|
1540
|
-
: this.findOptions.relations;
|
|
1541
|
-
this.buildRelations(relations, typeof this.findOptions.select === "object"
|
|
1542
|
-
? this.findOptions.select
|
|
1543
|
-
: undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1544
|
-
if (this.findOptions.loadEagerRelations !== false &&
|
|
1545
|
-
this.expressionMap.relationLoadStrategy === "join") {
|
|
1546
|
-
this.buildEagerRelations(relations, typeof this.findOptions.select === "object"
|
|
1547
|
-
? this.findOptions
|
|
1548
|
-
.select
|
|
1549
|
-
: undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1550
|
-
}
|
|
1551
|
-
}
|
|
1552
|
-
if (this.selects.length) {
|
|
1553
|
-
this.addSelect(this.selects);
|
|
1554
|
-
}
|
|
1555
|
-
if (this.findOptions.where) {
|
|
1556
|
-
this.conditions = this.buildWhere(this.findOptions.where, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1557
|
-
if (this.conditions.length)
|
|
1558
|
-
this.andWhere(this.conditions.substr(0, 1) !== "("
|
|
1559
|
-
? "(" + this.conditions + ")"
|
|
1560
|
-
: this.conditions); // temporary and where and braces
|
|
1561
|
-
}
|
|
1562
|
-
if (this.findOptions.order) {
|
|
1563
|
-
this.buildOrder(this.findOptions.order, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1564
|
-
}
|
|
1565
|
-
if (this.joins.length) {
|
|
1566
|
-
this.joins.forEach((join) => {
|
|
1567
|
-
if (join.select && !join.selection) {
|
|
1568
|
-
//
|
|
1569
|
-
if (join.type === "inner") {
|
|
1570
|
-
this.innerJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1571
|
-
}
|
|
1572
|
-
else {
|
|
1573
|
-
this.leftJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1576
|
-
else {
|
|
1577
|
-
if (join.type === "inner") {
|
|
1578
|
-
this.innerJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1579
|
-
}
|
|
1580
|
-
else {
|
|
1581
|
-
this.leftJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1582
|
-
}
|
|
1583
|
-
}
|
|
1584
|
-
});
|
|
1585
|
-
}
|
|
1586
|
-
if (this.findOptions.skip !== undefined) {
|
|
1587
|
-
this.skip(this.findOptions.skip);
|
|
1588
|
-
}
|
|
1589
|
-
if (this.findOptions.take !== undefined) {
|
|
1590
|
-
this.take(this.findOptions.take);
|
|
1591
|
-
}
|
|
1592
|
-
if (typeof this.findOptions.cache === "number") {
|
|
1593
|
-
this.cache(this.findOptions.cache);
|
|
1594
|
-
}
|
|
1595
|
-
else if (typeof this.findOptions.cache === "boolean") {
|
|
1596
|
-
this.cache(this.findOptions.cache);
|
|
1597
|
-
}
|
|
1598
|
-
else if (typeof this.findOptions.cache === "object") {
|
|
1599
|
-
this.cache(this.findOptions.cache.id, this.findOptions.cache.milliseconds);
|
|
1600
|
-
}
|
|
1601
|
-
if (this.findOptions.join) {
|
|
1602
|
-
if (this.findOptions.join.leftJoin)
|
|
1603
|
-
Object.keys(this.findOptions.join.leftJoin).forEach((key) => {
|
|
1604
|
-
this.leftJoin(this.findOptions.join.leftJoin[key], key);
|
|
1605
|
-
});
|
|
1606
|
-
if (this.findOptions.join.innerJoin)
|
|
1607
|
-
Object.keys(this.findOptions.join.innerJoin).forEach((key) => {
|
|
1608
|
-
this.innerJoin(this.findOptions.join.innerJoin[key], key);
|
|
1609
|
-
});
|
|
1610
|
-
if (this.findOptions.join.leftJoinAndSelect)
|
|
1611
|
-
Object.keys(this.findOptions.join.leftJoinAndSelect).forEach((key) => {
|
|
1612
|
-
this.leftJoinAndSelect(this.findOptions.join.leftJoinAndSelect[key], key);
|
|
1613
|
-
});
|
|
1614
|
-
if (this.findOptions.join.innerJoinAndSelect)
|
|
1615
|
-
Object.keys(this.findOptions.join.innerJoinAndSelect).forEach((key) => {
|
|
1616
|
-
this.innerJoinAndSelect(this.findOptions.join.innerJoinAndSelect[key], key);
|
|
1617
|
-
});
|
|
1618
|
-
}
|
|
1619
|
-
if (this.findOptions.lock) {
|
|
1620
|
-
if (this.findOptions.lock.mode === "optimistic") {
|
|
1621
|
-
this.setLock(this.findOptions.lock.mode, this.findOptions.lock.version);
|
|
1622
|
-
}
|
|
1623
|
-
else if (this.findOptions.lock.mode === "pessimistic_read" ||
|
|
1624
|
-
this.findOptions.lock.mode === "pessimistic_write" ||
|
|
1625
|
-
this.findOptions.lock.mode === "dirty_read" ||
|
|
1626
|
-
this.findOptions.lock.mode ===
|
|
1627
|
-
"pessimistic_partial_write" ||
|
|
1628
|
-
this.findOptions.lock.mode ===
|
|
1629
|
-
"pessimistic_write_or_fail" ||
|
|
1630
|
-
this.findOptions.lock.mode === "for_no_key_update" ||
|
|
1631
|
-
this.findOptions.lock.mode === "for_key_share") {
|
|
1632
|
-
const tableNames = this.findOptions.lock.tables
|
|
1633
|
-
? this.findOptions.lock.tables.map((table) => {
|
|
1634
|
-
const tableAlias = this.expressionMap.aliases.find((alias) => {
|
|
1635
|
-
return (alias.metadata
|
|
1636
|
-
.tableNameWithoutPrefix === table);
|
|
1637
|
-
});
|
|
1638
|
-
if (!tableAlias) {
|
|
1639
|
-
throw new TypeORMError(`"${table}" is not part of this query`);
|
|
1640
|
-
}
|
|
1641
|
-
return this.escape(tableAlias.name);
|
|
1642
|
-
})
|
|
1643
|
-
: undefined;
|
|
1644
|
-
this.setLock(this.findOptions.lock.mode, undefined, tableNames);
|
|
1645
|
-
if (this.findOptions.lock.onLocked) {
|
|
1646
|
-
this.setOnLocked(this.findOptions.lock.onLocked);
|
|
1647
|
-
}
|
|
1648
|
-
}
|
|
1649
|
-
}
|
|
1650
|
-
if (this.findOptions.loadRelationIds === true) {
|
|
1651
|
-
this.loadAllRelationIds();
|
|
1652
|
-
}
|
|
1653
|
-
else if (typeof this.findOptions.loadRelationIds === "object") {
|
|
1654
|
-
this.loadAllRelationIds(this.findOptions.loadRelationIds);
|
|
1655
|
-
}
|
|
1656
|
-
if (this.findOptions.loadEagerRelations !== false) {
|
|
1657
|
-
FindOptionsUtils.joinEagerRelations(this, this.expressionMap.mainAlias.name, this.expressionMap.mainAlias.metadata);
|
|
1658
|
-
}
|
|
1659
|
-
if (this.findOptions.transaction === true) {
|
|
1660
|
-
this.expressionMap.useTransaction = true;
|
|
1661
|
-
}
|
|
1662
|
-
}
|
|
1663
|
-
}
|
|
1664
|
-
/**
|
|
1665
|
-
* Executes sql generated by query builder and returns object with raw results and entities created from them.
|
|
1666
|
-
*/
|
|
1667
|
-
async executeEntitiesAndRawResults(queryRunner) {
|
|
1668
|
-
if (!this.expressionMap.mainAlias)
|
|
1669
|
-
throw new TypeORMError(`Alias is not set. Use "from" method to set an alias.`);
|
|
1670
|
-
if ((this.expressionMap.lockMode === "pessimistic_read" ||
|
|
1671
|
-
this.expressionMap.lockMode === "pessimistic_write" ||
|
|
1672
|
-
this.expressionMap.lockMode === "pessimistic_partial_write" ||
|
|
1673
|
-
this.expressionMap.lockMode === "pessimistic_write_or_fail" ||
|
|
1674
|
-
this.expressionMap.lockMode === "for_no_key_update" ||
|
|
1675
|
-
this.expressionMap.lockMode === "for_key_share") &&
|
|
1676
|
-
!queryRunner.isTransactionActive)
|
|
1677
|
-
throw new PessimisticLockTransactionRequiredError();
|
|
1678
|
-
if (this.expressionMap.lockMode === "optimistic") {
|
|
1679
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1680
|
-
if (!metadata.versionColumn && !metadata.updateDateColumn)
|
|
1681
|
-
throw new NoVersionOrUpdateDateColumnError(metadata.name);
|
|
1682
|
-
}
|
|
1683
|
-
const relationIdLoader = new RelationIdLoader(this.connection, queryRunner, this.expressionMap.relationIdAttributes);
|
|
1684
|
-
const relationCountLoader = new RelationCountLoader(this.connection, queryRunner, this.expressionMap.relationCountAttributes);
|
|
1685
|
-
const relationIdMetadataTransformer = new RelationIdMetadataToAttributeTransformer(this.expressionMap);
|
|
1686
|
-
relationIdMetadataTransformer.transform();
|
|
1687
|
-
const relationCountMetadataTransformer = new RelationCountMetadataToAttributeTransformer(this.expressionMap);
|
|
1688
|
-
relationCountMetadataTransformer.transform();
|
|
1689
|
-
let rawResults = [], entities = [];
|
|
1690
|
-
if ((this.expressionMap.skip || this.expressionMap.take) &&
|
|
1691
|
-
this.expressionMap.joinAttributes.length > 0) {
|
|
1692
|
-
const [selects, orderBys] = this.createOrderByCombinedWithSelectExpression("distinctAlias");
|
|
1693
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1694
|
-
const mainAliasName = this.expressionMap.mainAlias.name;
|
|
1695
|
-
const querySelects = metadata.primaryColumns.map((primaryColumn) => {
|
|
1696
|
-
const distinctAlias = this.escape("distinctAlias");
|
|
1697
|
-
const columnAlias = this.escape(DriverUtils.buildAlias(this.connection.driver, mainAliasName, primaryColumn.databaseName));
|
|
1698
|
-
if (!orderBys[columnAlias])
|
|
1699
|
-
orderBys[columnAlias] = "ASC";
|
|
1700
|
-
const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, primaryColumn.databaseName);
|
|
1701
|
-
return `${distinctAlias}.${columnAlias} AS ${this.escape(alias)}`;
|
|
1702
|
-
});
|
|
1703
|
-
rawResults = await new SelectQueryBuilder_1(this.connection, queryRunner)
|
|
1704
|
-
.select(`DISTINCT ${querySelects.join(", ")}`)
|
|
1705
|
-
.addSelect(selects)
|
|
1706
|
-
.from(`(${this.clone().orderBy().getQuery()})`, "distinctAlias")
|
|
1707
|
-
.offset(this.expressionMap.skip)
|
|
1708
|
-
.limit(this.expressionMap.take)
|
|
1709
|
-
.orderBy(orderBys)
|
|
1710
|
-
.cache(this.expressionMap.cache
|
|
1711
|
-
? this.expressionMap.cache
|
|
1712
|
-
: this.expressionMap.cacheId, this.expressionMap.cacheDuration)
|
|
1713
|
-
.setParameters(this.getParameters())
|
|
1714
|
-
.setNativeParameters(this.expressionMap.nativeParameters)
|
|
1715
|
-
.getRawMany();
|
|
1716
|
-
if (rawResults.length > 0) {
|
|
1717
|
-
let condition = "";
|
|
1718
|
-
const parameters = {};
|
|
1719
|
-
if (metadata.hasMultiplePrimaryKeys) {
|
|
1720
|
-
condition = rawResults
|
|
1721
|
-
.map((result, index) => {
|
|
1722
|
-
return metadata.primaryColumns
|
|
1723
|
-
.map((primaryColumn) => {
|
|
1724
|
-
const paramKey = `orm_distinct_ids_${index}_${primaryColumn.databaseName}`;
|
|
1725
|
-
parameters[paramKey] =
|
|
1726
|
-
result[`ids_${mainAliasName}_${primaryColumn.databaseName}`];
|
|
1727
|
-
return `${mainAliasName}.${primaryColumn.propertyPath}=:${paramKey}`;
|
|
1728
|
-
})
|
|
1729
|
-
.join(" AND ");
|
|
1730
|
-
})
|
|
1731
|
-
.join(" OR ");
|
|
1732
|
-
}
|
|
1733
|
-
else {
|
|
1734
|
-
const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, metadata.primaryColumns[0].databaseName);
|
|
1735
|
-
const ids = rawResults.map((result) => result[alias]);
|
|
1736
|
-
const areAllNumbers = ids.every((id) => typeof id === "number");
|
|
1737
|
-
if (areAllNumbers) {
|
|
1738
|
-
condition = `${mainAliasName}.${metadata.primaryColumns[0].propertyPath} IN (${ids.join(", ")})`;
|
|
1739
|
-
}
|
|
1740
|
-
else {
|
|
1741
|
-
parameters["orm_distinct_ids"] = ids;
|
|
1742
|
-
condition =
|
|
1743
|
-
mainAliasName +
|
|
1744
|
-
"." +
|
|
1745
|
-
metadata.primaryColumns[0].propertyPath +
|
|
1746
|
-
" IN (:...orm_distinct_ids)";
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1749
|
-
rawResults = await this.clone()
|
|
1750
|
-
.mergeExpressionMap({
|
|
1751
|
-
extraAppendedAndWhereCondition: condition,
|
|
1752
|
-
})
|
|
1753
|
-
.setParameters(parameters)
|
|
1754
|
-
.loadRawResults(queryRunner);
|
|
1755
|
-
}
|
|
1756
|
-
}
|
|
1757
|
-
else {
|
|
1758
|
-
rawResults = await this.loadRawResults(queryRunner);
|
|
1759
|
-
}
|
|
1760
|
-
if (rawResults.length > 0) {
|
|
1761
|
-
const rawRelationIdResults = await relationIdLoader.load(rawResults);
|
|
1762
|
-
const rawRelationCountResults = await relationCountLoader.load(rawResults);
|
|
1763
|
-
const transformer = new RawSqlResultsToEntityTransformer(this.expressionMap, this.connection.driver, rawRelationIdResults, rawRelationCountResults, this.queryRunner);
|
|
1764
|
-
entities = transformer.transform(rawResults, this.expressionMap.mainAlias);
|
|
1765
|
-
if (this.expressionMap.callListeners === true &&
|
|
1766
|
-
this.expressionMap.mainAlias.hasMetadata) {
|
|
1767
|
-
await queryRunner.broadcaster.broadcast("Load", this.expressionMap.mainAlias.metadata, entities);
|
|
1768
|
-
}
|
|
1769
|
-
}
|
|
1770
|
-
if (this.expressionMap.relationLoadStrategy === "query") {
|
|
1771
|
-
await Promise.all(this.relationMetadatas.map(async (relation) => {
|
|
1772
|
-
const relationTarget = relation.inverseEntityMetadata.target;
|
|
1773
|
-
const relationAlias = relation.inverseEntityMetadata.targetName;
|
|
1774
|
-
const select = Array.isArray(this.findOptions.select)
|
|
1775
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
|
|
1776
|
-
: this.findOptions.select;
|
|
1777
|
-
const relations = Array.isArray(this.findOptions.relations)
|
|
1778
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
|
|
1779
|
-
: this.findOptions.relations;
|
|
1780
|
-
const queryBuilder = this.createQueryBuilder()
|
|
1781
|
-
.select(relationAlias)
|
|
1782
|
-
.from(relationTarget, relationAlias)
|
|
1783
|
-
.setFindOptions({
|
|
1784
|
-
select: select
|
|
1785
|
-
? OrmUtils.deepValue(select, relation.propertyPath)
|
|
1786
|
-
: undefined,
|
|
1787
|
-
order: this.findOptions.order
|
|
1788
|
-
? OrmUtils.deepValue(this.findOptions.order, relation.propertyPath)
|
|
1789
|
-
: undefined,
|
|
1790
|
-
relations: relations
|
|
1791
|
-
? OrmUtils.deepValue(relations, relation.propertyPath)
|
|
1792
|
-
: undefined,
|
|
1793
|
-
withDeleted: this.findOptions.withDeleted,
|
|
1794
|
-
relationLoadStrategy: this.findOptions.relationLoadStrategy,
|
|
1795
|
-
});
|
|
1796
|
-
if (entities.length > 0) {
|
|
1797
|
-
const relatedEntityGroups = await this.connection.relationIdLoader.loadManyToManyRelationIdsAndGroup(relation, entities, undefined, queryBuilder);
|
|
1798
|
-
entities.forEach((entity) => {
|
|
1799
|
-
const relatedEntityGroup = relatedEntityGroups.find((group) => group.entity === entity);
|
|
1800
|
-
if (relatedEntityGroup) {
|
|
1801
|
-
const value = relatedEntityGroup.related === undefined
|
|
1802
|
-
? null
|
|
1803
|
-
: relatedEntityGroup.related;
|
|
1804
|
-
relation.setEntityValue(entity, value);
|
|
1805
|
-
}
|
|
1806
|
-
});
|
|
1807
|
-
}
|
|
1808
|
-
}));
|
|
1809
|
-
}
|
|
1810
|
-
return {
|
|
1811
|
-
raw: rawResults,
|
|
1812
|
-
entities: entities,
|
|
1813
|
-
};
|
|
1814
|
-
}
|
|
1815
|
-
createOrderByCombinedWithSelectExpression(parentAlias) {
|
|
1816
|
-
const orderBys = this.expressionMap.allOrderBys;
|
|
1817
|
-
const selectString = Object.keys(orderBys)
|
|
1818
|
-
.map((orderCriteria) => {
|
|
1819
|
-
if (orderCriteria.indexOf(".") !== -1) {
|
|
1820
|
-
const criteriaParts = orderCriteria.split(".");
|
|
1821
|
-
const aliasName = criteriaParts[0];
|
|
1822
|
-
const propertyPath = criteriaParts.slice(1).join(".");
|
|
1823
|
-
const alias = this.expressionMap.findAliasByName(aliasName);
|
|
1824
|
-
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
|
|
1825
|
-
return (this.escape(parentAlias) +
|
|
1826
|
-
"." +
|
|
1827
|
-
this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName)));
|
|
1828
|
-
}
|
|
1829
|
-
else {
|
|
1830
|
-
if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
|
|
1831
|
-
select.aliasName === orderCriteria))
|
|
1832
|
-
return this.escape(parentAlias) + "." + orderCriteria;
|
|
1833
|
-
return "";
|
|
1834
|
-
}
|
|
1835
|
-
})
|
|
1836
|
-
.join(", ");
|
|
1837
|
-
const orderByObject = {};
|
|
1838
|
-
Object.keys(orderBys).forEach((orderCriteria) => {
|
|
1839
|
-
if (orderCriteria.indexOf(".") !== -1) {
|
|
1840
|
-
const criteriaParts = orderCriteria.split(".");
|
|
1841
|
-
const aliasName = criteriaParts[0];
|
|
1842
|
-
const propertyPath = criteriaParts.slice(1).join(".");
|
|
1843
|
-
const alias = this.expressionMap.findAliasByName(aliasName);
|
|
1844
|
-
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
|
|
1845
|
-
orderByObject[this.escape(parentAlias) +
|
|
1846
|
-
"." +
|
|
1847
|
-
this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName))] = orderBys[orderCriteria];
|
|
1848
|
-
}
|
|
1849
|
-
else {
|
|
1850
|
-
if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
|
|
1851
|
-
select.aliasName === orderCriteria)) {
|
|
1852
|
-
orderByObject[this.escape(parentAlias) + "." + orderCriteria] = orderBys[orderCriteria];
|
|
1853
|
-
}
|
|
1854
|
-
else {
|
|
1855
|
-
orderByObject[orderCriteria] = orderBys[orderCriteria];
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
});
|
|
1859
|
-
return [selectString, orderByObject];
|
|
1860
|
-
}
|
|
1861
|
-
/**
|
|
1862
|
-
* Loads raw results from the database.
|
|
1863
|
-
*/
|
|
1864
|
-
async loadRawResults(queryRunner) {
|
|
1865
|
-
const [sql, parameters] = this.getQueryAndParameters();
|
|
1866
|
-
const queryId = sql + " -- PARAMETERS: " + JSON.stringify(parameters);
|
|
1867
|
-
const cacheOptions = typeof this.connection.options.cache === "object"
|
|
1868
|
-
? this.connection.options.cache
|
|
1869
|
-
: {};
|
|
1870
|
-
let savedQueryResultCacheOptions = undefined;
|
|
1871
|
-
let cacheError = false;
|
|
1872
|
-
if (this.connection.queryResultCache &&
|
|
1873
|
-
(this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
|
|
1874
|
-
try {
|
|
1875
|
-
savedQueryResultCacheOptions =
|
|
1876
|
-
await this.connection.queryResultCache.getFromCache({
|
|
1877
|
-
identifier: this.expressionMap.cacheId,
|
|
1878
|
-
query: queryId,
|
|
1879
|
-
duration: this.expressionMap.cacheDuration ||
|
|
1880
|
-
cacheOptions.duration ||
|
|
1881
|
-
1000,
|
|
1882
|
-
}, queryRunner);
|
|
1883
|
-
if (savedQueryResultCacheOptions &&
|
|
1884
|
-
!this.connection.queryResultCache.isExpired(savedQueryResultCacheOptions)) {
|
|
1885
|
-
return JSON.parse(savedQueryResultCacheOptions.result);
|
|
1886
|
-
}
|
|
1887
|
-
}
|
|
1888
|
-
catch (error) {
|
|
1889
|
-
if (!cacheOptions.ignoreErrors) {
|
|
1890
|
-
throw error;
|
|
1891
|
-
}
|
|
1892
|
-
cacheError = true;
|
|
1893
|
-
}
|
|
1894
|
-
}
|
|
1895
|
-
const results = await queryRunner.query(sql, parameters, true);
|
|
1896
|
-
if (!cacheError &&
|
|
1897
|
-
this.connection.queryResultCache &&
|
|
1898
|
-
(this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
|
|
1899
|
-
try {
|
|
1900
|
-
await this.connection.queryResultCache.storeInCache({
|
|
1901
|
-
identifier: this.expressionMap.cacheId,
|
|
1902
|
-
query: queryId,
|
|
1903
|
-
time: new Date().getTime(),
|
|
1904
|
-
duration: this.expressionMap.cacheDuration ||
|
|
1905
|
-
cacheOptions.duration ||
|
|
1906
|
-
1000,
|
|
1907
|
-
result: JSON.stringify(results.records),
|
|
1908
|
-
}, savedQueryResultCacheOptions, queryRunner);
|
|
1909
|
-
}
|
|
1910
|
-
catch (error) {
|
|
1911
|
-
if (!cacheOptions.ignoreErrors) {
|
|
1912
|
-
throw error;
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
}
|
|
1916
|
-
return results.records;
|
|
1917
|
-
}
|
|
1918
|
-
/**
|
|
1919
|
-
* Merges into expression map given expression map properties.
|
|
1920
|
-
*/
|
|
1921
|
-
mergeExpressionMap(expressionMap) {
|
|
1922
|
-
ObjectUtils.assign(this.expressionMap, expressionMap);
|
|
1923
|
-
return this;
|
|
1924
|
-
}
|
|
1925
|
-
/**
|
|
1926
|
-
* Normalizes a give number - converts to int if possible.
|
|
1927
|
-
*/
|
|
1928
|
-
normalizeNumber(num) {
|
|
1929
|
-
if (typeof num === "number" || num === undefined || num === null)
|
|
1930
|
-
return num;
|
|
1931
|
-
return Number(num);
|
|
1932
|
-
}
|
|
1933
|
-
/**
|
|
1934
|
-
* Creates a query builder used to execute sql queries inside this query builder.
|
|
1935
|
-
*/
|
|
1936
|
-
obtainQueryRunner() {
|
|
1937
|
-
return this.queryRunner || this.connection.createQueryRunner("slave");
|
|
1938
|
-
}
|
|
1939
|
-
buildSelect(select, metadata, alias, embedPrefix) {
|
|
1940
|
-
for (let key in select) {
|
|
1941
|
-
if (select[key] === undefined || select[key] === false)
|
|
1942
|
-
continue;
|
|
1943
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
1944
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
1945
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
1946
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
1947
|
-
if (!embed && !column && !relation)
|
|
1948
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
1949
|
-
if (column) {
|
|
1950
|
-
this.selects.push(alias + "." + propertyPath);
|
|
1951
|
-
}
|
|
1952
|
-
else if (embed) {
|
|
1953
|
-
this.buildSelect(// @ts-ignore
|
|
1954
|
-
select[key], metadata, alias, propertyPath);
|
|
1955
|
-
}
|
|
1956
|
-
}
|
|
1957
|
-
}
|
|
1958
|
-
buildRelations(relations, selection, metadata, alias, embedPrefix) {
|
|
1959
|
-
if (!relations)
|
|
1960
|
-
return;
|
|
1961
|
-
Object.keys(relations).forEach((relationName) => {
|
|
1962
|
-
const relationValue = relations[relationName];
|
|
1963
|
-
const propertyPath = embedPrefix
|
|
1964
|
-
? embedPrefix + "." + relationName
|
|
1965
|
-
: relationName;
|
|
1966
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
1967
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
1968
|
-
if (!embed && !relation)
|
|
1969
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
1970
|
-
if (embed) {
|
|
1971
|
-
this.buildRelations(relationValue, typeof selection === "object"
|
|
1972
|
-
? OrmUtils.deepValue(selection, embed.propertyPath)
|
|
1973
|
-
: undefined, metadata, alias, propertyPath);
|
|
1974
|
-
}
|
|
1975
|
-
else if (relation) {
|
|
1976
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
1977
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
1978
|
-
if (relationValue === true ||
|
|
1979
|
-
typeof relationValue === "object") {
|
|
1980
|
-
if (this.expressionMap.relationLoadStrategy === "query") {
|
|
1981
|
-
this.relationMetadatas.push(relation);
|
|
1982
|
-
}
|
|
1983
|
-
else {
|
|
1984
|
-
this.joins.push({
|
|
1985
|
-
type: "left",
|
|
1986
|
-
select: true,
|
|
1987
|
-
selection: selection &&
|
|
1988
|
-
typeof selection[relationName] === "object" // @ts-ignore
|
|
1989
|
-
? selection[relationName]
|
|
1990
|
-
: undefined,
|
|
1991
|
-
alias: joinAlias,
|
|
1992
|
-
parentAlias: alias,
|
|
1993
|
-
relationMetadata: relation,
|
|
1994
|
-
});
|
|
1995
|
-
if (selection &&
|
|
1996
|
-
typeof selection[relationName] === "object") {
|
|
1997
|
-
this.buildSelect(// @ts-ignore
|
|
1998
|
-
selection[relationName], relation.inverseEntityMetadata, joinAlias);
|
|
1999
|
-
}
|
|
2000
|
-
}
|
|
2001
|
-
}
|
|
2002
|
-
if (typeof relationValue === "object" &&
|
|
2003
|
-
this.expressionMap.relationLoadStrategy === "join") {
|
|
2004
|
-
this.buildRelations(relationValue, typeof selection === "object"
|
|
2005
|
-
? OrmUtils.deepValue(selection, relation.propertyPath)
|
|
2006
|
-
: undefined, relation.inverseEntityMetadata, joinAlias, undefined);
|
|
2007
|
-
}
|
|
2008
|
-
}
|
|
2009
|
-
});
|
|
2010
|
-
}
|
|
2011
|
-
buildEagerRelations(relations, selection, metadata, alias, embedPrefix) {
|
|
2012
|
-
if (!relations)
|
|
2013
|
-
return;
|
|
2014
|
-
Object.keys(relations).forEach((relationName) => {
|
|
2015
|
-
const relationValue = relations[relationName];
|
|
2016
|
-
const propertyPath = embedPrefix
|
|
2017
|
-
? embedPrefix + "." + relationName
|
|
2018
|
-
: relationName;
|
|
2019
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2020
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2021
|
-
if (!embed && !relation)
|
|
2022
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2023
|
-
if (embed) {
|
|
2024
|
-
this.buildEagerRelations(relationValue, typeof selection === "object"
|
|
2025
|
-
? OrmUtils.deepValue(selection, embed.propertyPath)
|
|
2026
|
-
: undefined, metadata, alias, propertyPath);
|
|
2027
|
-
}
|
|
2028
|
-
else if (relation) {
|
|
2029
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
2030
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2031
|
-
if (relationValue === true ||
|
|
2032
|
-
typeof relationValue === "object") {
|
|
2033
|
-
relation.inverseEntityMetadata.eagerRelations.forEach((eagerRelation) => {
|
|
2034
|
-
let eagerRelationJoinAlias = joinAlias +
|
|
2035
|
-
"_" +
|
|
2036
|
-
eagerRelation.propertyPath.replace(".", "_");
|
|
2037
|
-
eagerRelationJoinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, joinAlias, eagerRelationJoinAlias);
|
|
2038
|
-
const existJoin = this.joins.find((join) => join.alias === eagerRelationJoinAlias);
|
|
2039
|
-
if (!existJoin) {
|
|
2040
|
-
this.joins.push({
|
|
2041
|
-
type: "left",
|
|
2042
|
-
select: true,
|
|
2043
|
-
alias: eagerRelationJoinAlias,
|
|
2044
|
-
parentAlias: joinAlias,
|
|
2045
|
-
selection: undefined,
|
|
2046
|
-
relationMetadata: eagerRelation,
|
|
2047
|
-
});
|
|
2048
|
-
}
|
|
2049
|
-
if (selection &&
|
|
2050
|
-
typeof selection[relationName] === "object") {
|
|
2051
|
-
this.buildSelect(// @ts-ignore
|
|
2052
|
-
selection[relationName], relation.inverseEntityMetadata, joinAlias);
|
|
2053
|
-
}
|
|
2054
|
-
});
|
|
2055
|
-
}
|
|
2056
|
-
if (typeof relationValue === "object") {
|
|
2057
|
-
this.buildEagerRelations(relationValue, typeof selection === "object"
|
|
2058
|
-
? OrmUtils.deepValue(selection, relation.propertyPath)
|
|
2059
|
-
: undefined, relation.inverseEntityMetadata, joinAlias, undefined);
|
|
2060
|
-
}
|
|
2061
|
-
}
|
|
2062
|
-
});
|
|
2063
|
-
}
|
|
2064
|
-
buildOrder(order, metadata, alias, embedPrefix) {
|
|
2065
|
-
for (let key in order) {
|
|
2066
|
-
if (order[key] === undefined)
|
|
2067
|
-
continue;
|
|
2068
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
2069
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
2070
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2071
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2072
|
-
if (!embed && !column && !relation)
|
|
2073
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2074
|
-
if (column) {
|
|
2075
|
-
let direction = typeof order[key] === "object"
|
|
2076
|
-
? order[key].direction
|
|
2077
|
-
: order[key];
|
|
2078
|
-
direction =
|
|
2079
|
-
direction === "DESC" ||
|
|
2080
|
-
direction === "desc" ||
|
|
2081
|
-
direction === -1
|
|
2082
|
-
? "DESC"
|
|
2083
|
-
: "ASC";
|
|
2084
|
-
let nulls = typeof order[key] === "object"
|
|
2085
|
-
? order[key].nulls
|
|
2086
|
-
: undefined;
|
|
2087
|
-
nulls =
|
|
2088
|
-
nulls?.toLowerCase() === "first"
|
|
2089
|
-
? "NULLS FIRST"
|
|
2090
|
-
: nulls?.toLowerCase() === "last"
|
|
2091
|
-
? "NULLS LAST"
|
|
2092
|
-
: undefined;
|
|
2093
|
-
let aliasPath = `${alias}.${propertyPath}`;
|
|
2094
|
-
if (column.isVirtualProperty && column.query) {
|
|
2095
|
-
const selection = this.expressionMap.selects.find((s) => s.selection === aliasPath);
|
|
2096
|
-
if (selection) {
|
|
2097
|
-
aliasPath = DriverUtils.buildAlias(this.connection.driver, alias, column.databaseName);
|
|
2098
|
-
selection.aliasName = aliasPath;
|
|
2099
|
-
}
|
|
2100
|
-
else {
|
|
2101
|
-
aliasPath = `(${column.query(alias)})`;
|
|
2102
|
-
}
|
|
2103
|
-
}
|
|
2104
|
-
this.addOrderBy(aliasPath, direction, nulls);
|
|
2105
|
-
}
|
|
2106
|
-
else if (embed) {
|
|
2107
|
-
this.buildOrder(order[key], metadata, alias, propertyPath);
|
|
2108
|
-
}
|
|
2109
|
-
else if (relation) {
|
|
2110
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
2111
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2112
|
-
const existJoin = this.joins.find((join) => join.alias === joinAlias);
|
|
2113
|
-
if (!existJoin) {
|
|
2114
|
-
this.joins.push({
|
|
2115
|
-
type: "left",
|
|
2116
|
-
select: false,
|
|
2117
|
-
alias: joinAlias,
|
|
2118
|
-
parentAlias: alias,
|
|
2119
|
-
selection: undefined,
|
|
2120
|
-
relationMetadata: relation,
|
|
2121
|
-
});
|
|
2122
|
-
}
|
|
2123
|
-
this.buildOrder(order[key], relation.inverseEntityMetadata, joinAlias);
|
|
2124
|
-
}
|
|
2125
|
-
}
|
|
2126
|
-
}
|
|
2127
|
-
buildWhere(where, metadata, alias, embedPrefix) {
|
|
2128
|
-
let condition = "";
|
|
2129
|
-
if (Array.isArray(where)) {
|
|
2130
|
-
condition =
|
|
2131
|
-
"(" +
|
|
2132
|
-
where
|
|
2133
|
-
.map((whereItem) => {
|
|
2134
|
-
return this.buildWhere(whereItem, metadata, alias, embedPrefix);
|
|
2135
|
-
})
|
|
2136
|
-
.filter((condition) => !!condition)
|
|
2137
|
-
.map((condition) => "(" + condition + ")")
|
|
2138
|
-
.join(" OR ") +
|
|
2139
|
-
")";
|
|
2140
|
-
}
|
|
2141
|
-
else {
|
|
2142
|
-
let andConditions = [];
|
|
2143
|
-
for (let key in where) {
|
|
2144
|
-
if (where[key] === undefined || where[key] === null)
|
|
2145
|
-
continue;
|
|
2146
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
2147
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
2148
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2149
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2150
|
-
if (!embed && !column && !relation)
|
|
2151
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2152
|
-
if (column) {
|
|
2153
|
-
let aliasPath = `${alias}.${propertyPath}`;
|
|
2154
|
-
if (column.isVirtualProperty && column.query) {
|
|
2155
|
-
aliasPath = `(${column.query(alias)})`;
|
|
2156
|
-
}
|
|
2157
|
-
let parameterValue = where[key];
|
|
2158
|
-
if (InstanceChecker.isEqualOperator(where[key])) {
|
|
2159
|
-
parameterValue = where[key].value;
|
|
2160
|
-
}
|
|
2161
|
-
if (column.transformer) {
|
|
2162
|
-
parameterValue = ApplyValueTransformers.transformTo(column.transformer, parameterValue);
|
|
2163
|
-
}
|
|
2164
|
-
//
|
|
2165
|
-
//
|
|
2166
|
-
andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, parameterValue)));
|
|
2167
|
-
}
|
|
2168
|
-
else if (embed) {
|
|
2169
|
-
const condition = this.buildWhere(where[key], metadata, alias, propertyPath);
|
|
2170
|
-
if (condition)
|
|
2171
|
-
andConditions.push(condition);
|
|
2172
|
-
}
|
|
2173
|
-
else if (relation) {
|
|
2174
|
-
if (typeof where[key] === "object") {
|
|
2175
|
-
const allAllUndefined = Object.keys(where[key]).every((k) => where[key][k] === undefined);
|
|
2176
|
-
if (allAllUndefined) {
|
|
2177
|
-
continue;
|
|
2178
|
-
}
|
|
2179
|
-
}
|
|
2180
|
-
if (InstanceChecker.isFindOperator(where[key])) {
|
|
2181
|
-
if (where[key].type === "moreThan" ||
|
|
2182
|
-
where[key].type === "lessThan") {
|
|
2183
|
-
const sqlOperator = where[key].type === "moreThan" ? ">" : "<";
|
|
2184
|
-
const qb = this.subQuery();
|
|
2185
|
-
if (relation.isManyToManyOwner) {
|
|
2186
|
-
qb.select("COUNT(*)")
|
|
2187
|
-
.from(relation.joinTableName, relation.joinTableName)
|
|
2188
|
-
.where(relation.joinColumns
|
|
2189
|
-
.map((column) => {
|
|
2190
|
-
return `${relation.joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2191
|
-
.propertyName}`;
|
|
2192
|
-
})
|
|
2193
|
-
.join(" AND "));
|
|
2194
|
-
}
|
|
2195
|
-
else if (relation.isManyToManyNotOwner) {
|
|
2196
|
-
qb.select("COUNT(*)")
|
|
2197
|
-
.from(relation.inverseRelation.joinTableName, relation.inverseRelation.joinTableName)
|
|
2198
|
-
.where(relation
|
|
2199
|
-
.inverseRelation.inverseJoinColumns.map((column) => {
|
|
2200
|
-
return `${relation.inverseRelation
|
|
2201
|
-
.joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2202
|
-
.propertyName}`;
|
|
2203
|
-
})
|
|
2204
|
-
.join(" AND "));
|
|
2205
|
-
}
|
|
2206
|
-
else if (relation.isOneToMany) {
|
|
2207
|
-
qb.select("COUNT(*)")
|
|
2208
|
-
.from(relation.inverseEntityMetadata.target, relation.inverseEntityMetadata
|
|
2209
|
-
.tableName)
|
|
2210
|
-
.where(relation
|
|
2211
|
-
.inverseRelation.joinColumns.map((column) => {
|
|
2212
|
-
return `${relation
|
|
2213
|
-
.inverseEntityMetadata
|
|
2214
|
-
.tableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2215
|
-
.propertyName}`;
|
|
2216
|
-
})
|
|
2217
|
-
.join(" AND "));
|
|
2218
|
-
}
|
|
2219
|
-
else {
|
|
2220
|
-
throw new Error(`This relation isn't supported by given find operator`);
|
|
2221
|
-
}
|
|
2222
|
-
this.andWhere(qb.getSql() +
|
|
2223
|
-
" " +
|
|
2224
|
-
sqlOperator +
|
|
2225
|
-
" " +
|
|
2226
|
-
parseInt(where[key].value));
|
|
2227
|
-
}
|
|
2228
|
-
else {
|
|
2229
|
-
if (relation.isManyToOne ||
|
|
2230
|
-
(relation.isOneToOne &&
|
|
2231
|
-
relation.isOneToOneOwner)) {
|
|
2232
|
-
const aliasPath = `${alias}.${propertyPath}`;
|
|
2233
|
-
andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, where[key])));
|
|
2234
|
-
}
|
|
2235
|
-
else {
|
|
2236
|
-
throw new Error(`This relation isn't supported by given find operator`);
|
|
2237
|
-
}
|
|
2238
|
-
}
|
|
2239
|
-
}
|
|
2240
|
-
else {
|
|
2241
|
-
let joinAlias = alias +
|
|
2242
|
-
"_" +
|
|
2243
|
-
relation.propertyPath.replace(".", "_");
|
|
2244
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2245
|
-
const existJoin = this.joins.find((join) => join.alias === joinAlias);
|
|
2246
|
-
if (!existJoin) {
|
|
2247
|
-
this.joins.push({
|
|
2248
|
-
type: "inner",
|
|
2249
|
-
select: false,
|
|
2250
|
-
selection: undefined,
|
|
2251
|
-
alias: joinAlias,
|
|
2252
|
-
parentAlias: alias,
|
|
2253
|
-
relationMetadata: relation,
|
|
2254
|
-
});
|
|
2255
|
-
}
|
|
2256
|
-
else {
|
|
2257
|
-
if (existJoin.type === "left")
|
|
2258
|
-
existJoin.type = "inner";
|
|
2259
|
-
}
|
|
2260
|
-
const condition = this.buildWhere(where[key], relation.inverseEntityMetadata, joinAlias);
|
|
2261
|
-
if (condition) {
|
|
2262
|
-
andConditions.push(condition);
|
|
2263
|
-
}
|
|
2264
|
-
}
|
|
2265
|
-
}
|
|
2266
|
-
}
|
|
2267
|
-
condition = andConditions.join(" AND ");
|
|
2268
|
-
}
|
|
2269
|
-
return condition;
|
|
2270
|
-
}
|
|
2271
|
-
};
|
|
2272
|
-
SelectQueryBuilder = SelectQueryBuilder_1 = __decorate([
|
|
2273
|
-
CLASS.NAME('SelectQueryBuilder')
|
|
2274
|
-
], SelectQueryBuilder);
|
|
2275
|
-
export { SelectQueryBuilder };
|
|
2276
|
-
;
|
|
2277
|
-
({}); // @--end-of-file-for-module=taon-typeorm lib/typeorm/query-builder/SelectQueryBuilder.ts
|
|
2278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0UXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3QvdGFvbi10eXBlb3JtL3Byb2plY3RzL3Rhb24tdHlwZW9ybS9zcmMvbGliL3R5cGVvcm0vcXVlcnktYnVpbGRlci9TZWxlY3RRdWVyeUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQTtBQUVqRyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQTtBQUMxRyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUM1RixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNoRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUMxRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDdkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDakUsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sd0RBQXdELENBQUE7QUFDakgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDMUUsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLE1BQU0sOERBQThELENBQUE7QUFDMUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzdDLEtBQUs7QUFDTCxLQUFLO0FBRUwsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNkNBQTZDLENBQUE7QUFjaEcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sOENBQThDLENBQUE7QUFFbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBTXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUNsRixLQUFLO0FBQ0wsS0FBSztBQUVMLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFFeEQ7O0dBRUc7QUFFSSxJQUFNLGtCQUFrQiwwQkFBeEIsTUFBTSxrQkFDVCxTQUFRLFlBQW9CO0lBRHpCOztRQUlNLG1CQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRS9DLGdCQUFXLEdBQW9CLEVBQUUsQ0FBQTtRQUNqQyxZQUFPLEdBQWEsRUFBRSxDQUFBO1FBQ3RCLFVBQUssR0FPVCxFQUFFLENBQUE7UUFDRSxlQUFVLEdBQVcsRUFBRSxDQUFBO1FBQ3ZCLGFBQVEsR0FJWixFQUFFLENBQUE7UUFDRSxzQkFBaUIsR0FBdUIsRUFBRSxDQUFBO0lBd29JeEQsQ0FBQztJQWxvSUc7O09BRUc7SUFDSCxRQUFRO1FBQ0osSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzlCLEdBQUcsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUNqQyxHQUFHLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7UUFDcEMsR0FBRyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQ2xDLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUNuQyxHQUFHLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDckMsR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBQ3BDLEdBQUcsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUNyQyxHQUFHLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDekMsR0FBRyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQ2xDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDaEIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVE7WUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDdEQsT0FBTyxHQUFHLENBQUE7SUFDZCxDQUFDO0lBTUQsY0FBYyxDQUFDLFdBQW9DO1FBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3ZCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNKLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQ3BDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUNoQyxFQUFFLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQzVCLE9BQU8sRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQTZCRDs7O09BR0c7SUFDSCxNQUFNLENBQ0YsU0FHZ0UsRUFDaEUsa0JBQTJCO1FBRTNCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQTtRQUN2QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxTQUFTLEVBQUUsU0FBUzthQUN2QixDQUFDLENBQUMsQ0FBQTtRQUNQLENBQUM7YUFBTSxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1lBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDNUIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JDLFNBQVMsRUFBRSxrQkFBa0I7YUFDaEMsQ0FBQyxDQUFBO1FBQ04sQ0FBQzthQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7Z0JBQ3pCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7YUFDMUQsQ0FBQTtRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFvQkQ7O09BRUc7SUFDSCxTQUFTLENBQ0wsU0FHZ0UsRUFDaEUsa0JBQTJCO1FBRTNCLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUMxRCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FDM0QsQ0FBQTtRQUNMLENBQUM7YUFBTSxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1lBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDNUIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JDLFNBQVMsRUFBRSxrQkFBa0I7YUFDaEMsQ0FBQyxDQUFBO1FBQ04sQ0FBQzthQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUM1QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsU0FBUyxFQUFFLGtCQUFrQjthQUNoQyxDQUFDLENBQUE7UUFDTixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsWUFBb0I7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUE7UUFDbEQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsV0FBb0IsSUFBSTtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUE7UUFDNUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsVUFBb0I7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUE7UUFDaEQsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBc0JEOzs7O09BSUc7SUFDSCxJQUFJLENBQ0EsWUFFZ0UsRUFDaEUsU0FBaUI7UUFFakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDMUMsT0FBTyxJQUFvQyxDQUFBO0lBQy9DLENBQUM7SUFvQkQ7OztPQUdHO0lBQ0gsT0FBTyxDQUNILFlBRWdFLEVBQ2hFLFNBQWlCO1FBRWpCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFMUMsT0FBTyxJQUFvQyxDQUFBO0lBQy9DLENBQUM7SUFxREQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FDTCxnQkFHZ0UsRUFDaEUsS0FBYSxFQUNiLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDbEUsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBcUREOzs7O09BSUc7SUFDSCxRQUFRLENBQ0osZ0JBR2dFLEVBQ2hFLEtBQWEsRUFDYixTQUFrQixFQUNsQixVQUEwQjtRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ2pFLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQXFERDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQ2QsZ0JBR2dFLEVBQ2hFLEtBQWEsRUFDYixTQUFrQixFQUNsQixVQUEwQjtRQUUxQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUM5RCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFxREQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUNiLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDN0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBa0VEOzs7Ozs7T0FNRztJQUNILG1CQUFtQixDQUNmLGFBQXFCLEVBQ3JCLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLElBQUksQ0FDUCxDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBa0VEOzs7Ozs7T0FNRztJQUNILGtCQUFrQixDQUNkLGFBQXFCLEVBQ3JCLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLEtBQUssQ0FDUixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBa0VEOzs7Ozs7T0FNRztJQUNILGtCQUFrQixDQUNkLGFBQXFCLEVBQ3JCLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNMLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLElBQUksQ0FDUCxDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBa0VEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUNiLGFBQXFCLEVBQ3JCLGdCQUdnRSxFQUNoRSxLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUNMLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLEtBQUssQ0FDUixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBZ0REOzs7T0FHRztJQUNILG9CQUFvQixDQUNoQixhQUFxQixFQUNyQixZQUFvQixFQUNwQixrQkFBMkQsRUFDM0QsbUJBRTRCO1FBRTVCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDdkUsbUJBQW1CLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNqRCxtQkFBbUIsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBQy9DLElBQUksT0FBTyxrQkFBa0IsS0FBSyxRQUFRO1lBQ3RDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQTtRQUNsRCxJQUNJLE9BQU8sa0JBQWtCLEtBQUssUUFBUTtZQUNyQyxrQkFBMEIsQ0FBQyxlQUFlO1lBRTNDLG1CQUFtQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFFOUMsbUJBQW1CLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUVqRSxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUMzQixJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsbUJBQW1CLENBQUMsYUFBYTtnQkFDdkMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7YUFDaEUsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILHVCQUF1QixDQUNuQixhQUFxQixFQUNyQixZQUFvQixFQUNwQixTQUFrQixFQUNsQixtQkFFNEI7UUFFNUIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLHNCQUFzQixDQUNyRCxJQUFJLENBQUMsYUFBYSxDQUNyQixDQUFBO1FBQ0Qsc0JBQXNCLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNwRCxzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBQ2xELHNCQUFzQixDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7UUFDeEMsc0JBQXNCLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7UUFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUV2RSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUMzQixJQUFJLEVBQUUsT0FBTztZQUNiLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxhQUFhO1NBQzdDLENBQUMsQ0FBQTtRQUNGLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLElBQUksRUFBRSxPQUFPO2dCQUNiLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxhQUFhO2dCQUMxQyxRQUFRLEVBQ0osc0JBQXNCLENBQUMsUUFBUSxDQUFDLHNCQUFzQjthQUM3RCxDQUFDLENBQUE7UUFDTixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLE9BR2xCO1FBRUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRSxJQUNJLE9BQU8sS0FBSyxTQUFTO2dCQUNyQixPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXZELE9BQU07WUFFVixJQUFJLENBQUMsb0JBQW9CLENBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUk7Z0JBQzlCLEdBQUc7Z0JBQ0gsUUFBUSxDQUFDLFlBQVksRUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSTtnQkFDOUIsR0FBRztnQkFDSCxRQUFRLENBQUMsWUFBWSxFQUN6QixPQUFPLENBQ1YsQ0FBQTtRQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQ0QsS0FLcUIsRUFDckIsVUFBMEI7UUFFMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFBLENBQUMsb0ZBQW9GO1FBQ25ILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMvQyxJQUFJLFNBQVM7WUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRztnQkFDeEIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7YUFDM0MsQ0FBQTtRQUNMLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUNKLEtBS3FCLEVBQ3JCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLEVBQUUsS0FBSztZQUNYLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1NBQzNDLENBQUMsQ0FBQTtRQUNGLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUNILEtBS3FCLEVBQ3JCLFVBQTBCO1FBRTFCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLEVBQUUsSUFBSTtZQUNWLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1NBQzNDLENBQUMsQ0FBQTtRQUNGLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FBQyxHQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxhQUFhLENBQUMsR0FBZ0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxDQUFDLEdBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBYyxFQUFFLFVBQTBCO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDdEUsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM5QyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLFVBQTBCO1FBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbkUsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM5QyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsTUFBYyxFQUFFLFVBQTBCO1FBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbEUsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM5QyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFnQkQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxPQUFnQjtRQUNwQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNwQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBZTtRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBNkJEOzs7O09BSUc7SUFDSCxPQUFPLENBQ0gsSUFBZ0MsRUFDaEMsUUFBd0IsS0FBSyxFQUM3QixLQUFvQztRQUVwQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTTtZQUMxRCxNQUFNLElBQUksWUFBWSxDQUNsQixnRkFBZ0YsQ0FDbkYsQ0FBQTtRQUNMLElBQ0ksS0FBSyxLQUFLLFNBQVM7WUFDbkIsS0FBSyxLQUFLLGFBQWE7WUFDdkIsS0FBSyxLQUFLLFlBQVk7WUFFdEIsTUFBTSxJQUFJLFlBQVksQ0FDbEIsOEZBQThGLENBQ2pHLENBQUE7UUFFTCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBd0IsQ0FBQTtZQUMxRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDUixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRzt3QkFDMUIsQ0FBQyxJQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7cUJBQ3JDLENBQUE7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQTtnQkFDN0QsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNwQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQ04sSUFBWSxFQUNaLFFBQXdCLEtBQUssRUFDN0IsS0FBb0M7UUFFcEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU07WUFDMUQsTUFBTSxJQUFJLFlBQVksQ0FDbEIsZ0ZBQWdGLENBQ25GLENBQUE7UUFDTCxJQUNJLEtBQUssS0FBSyxTQUFTO1lBQ25CLEtBQUssS0FBSyxhQUFhO1lBQ3ZCLEtBQUssS0FBSyxZQUFZO1lBRXRCLE1BQU0sSUFBSSxZQUFZLENBQ2xCLDhGQUE4RixDQUNqRyxDQUFBO1FBRUwsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFBO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFjO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUUvQixNQUFNLElBQUksWUFBWSxDQUNsQix5RUFBeUUsQ0FDNUUsQ0FBQTtRQUVMLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQWU7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4RCxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBRWhDLE1BQU0sSUFBSSxZQUFZLENBQ2xCLDBFQUEwRSxDQUM3RSxDQUFBO1FBRUwsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsSUFBYTtRQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxTQUFTO1lBQ3JDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUU5QixNQUFNLElBQUksWUFBWSxDQUNsQix3RUFBd0UsQ0FDM0UsQ0FBQTtRQUVMLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQWE7UUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3BELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFFOUIsTUFBTSxJQUFJLFlBQVksQ0FDbEIsd0VBQXdFLENBQzNFLENBQUE7UUFFTCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEtBQWE7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBRW5DLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQTZCRDs7T0FFRztJQUNILE9BQU8sQ0FDSCxRQWNxQixFQUNyQixXQUEyQixFQUMzQixVQUFxQjtRQUVyQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUMxQyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxRQUFrQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDdEMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3JDLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVM7UUFDWCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUM1QyxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQTtRQUUvQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDNUMsSUFBSSxzQkFBc0IsR0FBWSxLQUFLLENBQUE7UUFDM0MsSUFBSSxDQUFDO1lBRUQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsS0FBSyxJQUFJO2dCQUMxQyxXQUFXLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUMzQyxDQUFDO2dCQUNDLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUE7Z0JBQ3BDLHNCQUFzQixHQUFHLElBQUksQ0FBQTtZQUNqQyxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBR3RELElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUN6QyxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUE7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFFYixJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQztvQkFDRCxNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO2dCQUMzQyxDQUFDO2dCQUFDLE9BQU8sYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQTtRQUNmLENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFbkMsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDL0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBSW5CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzVDLElBQUksc0JBQXNCLEdBQVksS0FBSyxDQUFBO1FBQzNDLElBQUksQ0FBQztZQUVELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEtBQUssSUFBSTtnQkFDMUMsV0FBVyxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFDM0MsQ0FBQztnQkFDQyxNQUFNLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO2dCQUNwQyxzQkFBc0IsR0FBRyxJQUFJLENBQUE7WUFDakMsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUdwRSxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFBO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBRWIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUM7b0JBQ0QsTUFBTSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtnQkFDM0MsQ0FBQztnQkFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVztnQkFFaEMsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUM5QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBUSxDQUFBO1FBRXpDLElBQ0ksTUFBTTtZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFlBQVk7WUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQ2hDLENBQUM7WUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxRQUFRLENBQUE7WUFFdkQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsWUFBWSxJQUFJLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxhQUFhLEdBQ2YsUUFBUSxDQUFDLGdCQUFpQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLDZCQUE2QjtnQkFDbkYsSUFDSSxhQUFhLENBQUMsT0FBTyxFQUFFO29CQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7b0JBRXhDLE1BQU0sSUFBSSxrQ0FBa0MsQ0FDeEMsUUFBUSxDQUFDLElBQUksRUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFDOUIsYUFBYSxDQUNoQixDQUFBO1lBQ1QsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sYUFBYSxHQUNmLFFBQVEsQ0FBQyxhQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsNkJBQTZCO2dCQUNoRixJQUFJLGFBQWEsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVc7b0JBQ2hELE1BQU0sSUFBSSxrQ0FBa0MsQ0FDeEMsUUFBUSxDQUFDLElBQUksRUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFDOUIsYUFBYSxDQUNoQixDQUFBO1lBQ1QsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQTtRQUNmLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNkLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBRWxDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsTUFBTSxFQUNwQyxJQUFJLENBQ1AsQ0FBQTtRQUNMLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNULElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUM1QyxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzlDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVE7UUFDVixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFlBQVk7WUFDNUMsTUFBTSxJQUFJLCtCQUErQixFQUFFLENBQUE7UUFFL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDNUMsSUFBSSxzQkFBc0IsR0FBWSxLQUFLLENBQUE7UUFDM0MsSUFBSSxDQUFDO1lBRUQsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsS0FBSyxJQUFJO2dCQUMxQyxXQUFXLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUMzQyxDQUFDO2dCQUNDLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUE7Z0JBQ3BDLHNCQUFzQixHQUFHLElBQUksQ0FBQTtZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBR3pELElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUN6QyxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUE7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFFYixJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQztvQkFDRCxNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO2dCQUMzQyxDQUFDO2dCQUFDLE9BQU8sYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQTtRQUNmLENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxXQUFXO2dCQUVoQyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxlQUFlO1FBQ2pCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUM1QyxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUM1QyxJQUFJLHNCQUFzQixHQUFZLEtBQUssQ0FBQTtRQUMzQyxJQUFJLENBQUM7WUFFRCxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxLQUFLLElBQUk7Z0JBQzFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLEVBQzNDLENBQUM7Z0JBQ0MsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtnQkFDcEMsc0JBQXNCLEdBQUcsSUFBSSxDQUFBO1lBQ2pDLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7WUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQzFELFdBQVcsQ0FDZCxDQUFBO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFBO1lBRzFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO1lBQ25FLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0sT0FBTyxHQUF1QixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFHcEUsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQ3pDLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQTtRQUNsQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUViLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNELE1BQU0sV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUE7Z0JBQzNDLENBQUM7Z0JBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQyxDQUFBLENBQUM7WUFDOUIsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFBO1FBQ2YsQ0FBQztnQkFBUyxDQUFDO1lBQ1AsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLFdBQVc7Z0JBRWhDLE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBb0VEOztPQUVHO0lBQ0gsS0FBSyxDQUNELHlCQUFvRCxFQUNwRCxpQkFBMEI7UUFFMUIsSUFBSSxPQUFPLHlCQUF5QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLHlCQUF5QixDQUFBO1FBQ3hELENBQUM7YUFBTSxJQUFJLE9BQU8seUJBQXlCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLHlCQUF5QixDQUFBO1FBQ2hFLENBQUM7YUFBTSxJQUNILE9BQU8seUJBQXlCLEtBQUssUUFBUTtZQUM3QyxPQUFPLHlCQUF5QixLQUFLLFFBQVEsRUFDL0MsQ0FBQztZQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQTtRQUMxRCxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFBO1FBQ3hELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxNQUFnQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBTVMsSUFBSSxDQUNWLFNBQTJCLEVBQzNCLGdCQUdnRSxFQUNoRSxTQUFpQixFQUNqQixTQUFrQixFQUNsQixVQUEwQixFQUMxQixhQUFzQixFQUN0QixhQUF1QjtRQUV2QixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUVwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FDbkMsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsYUFBYSxDQUNyQixDQUFBO1FBQ0QsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDbkMsYUFBYSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDM0MsYUFBYSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDM0MsYUFBYSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBLENBQUMsZUFBZTtRQUNqRSxhQUFhLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUEsQ0FBQywyQkFBMkI7UUFFdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJELElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQ0ksYUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7Z0JBQ3ZDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQ2pDLENBQUM7Z0JBQ0MsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLFNBQVMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksVUFBVSxDQUFBO2dCQUM1RyxhQUFhLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTO29CQUM3QyxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsU0FBUyxRQUFRLHFCQUFxQixFQUFFO29CQUM1RCxDQUFDLENBQUMsR0FBRyxxQkFBcUIsRUFBRSxDQUFBO1lBQ3BDLENBQUM7WUFFRCxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUNqRCxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsU0FBUztnQkFDZixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7YUFDbkMsQ0FBQyxDQUFBO1lBQ0YsSUFDSSxhQUFhLENBQUMsUUFBUTtnQkFDdEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFDL0MsQ0FBQztnQkFDQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztvQkFDM0IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLGFBQWEsQ0FBQyxhQUFhO29CQUNqQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7aUJBQzFELENBQUMsQ0FBQTtZQUNOLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksUUFBUSxHQUFXLEVBQUUsQ0FBQTtZQUN6QixJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sZUFBZSxHQUNqQixnQkFDSCxDQUFFLElBQXVDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtnQkFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtnQkFDbkQsUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtZQUN6QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osUUFBUSxHQUFHLGdCQUFnQixDQUFBO1lBQy9CLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FDWixPQUFPLGdCQUFnQixLQUFLLFVBQVU7Z0JBQ3RDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHO29CQUNsQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtZQUM1QyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUNqRCxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQ0wsVUFBVSxLQUFLLEtBQUs7b0JBQ2hCLENBQUMsQ0FBRSxnQkFBMkI7b0JBQzlCLENBQUMsQ0FBQyxTQUFTO2dCQUNuQixRQUFRLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQ3ZELENBQUMsQ0FBQTtRQUNOLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUM3QixNQUFNLElBQUksWUFBWSxDQUNsQix3RUFBd0UsQ0FDM0UsQ0FBQTtRQUlMLE1BQU0sVUFBVSxHQUFrQixFQUFFLENBQUE7UUFDcEMsTUFBTSxlQUFlLEdBQWtCLEVBQUUsQ0FBQTtRQUV6QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQTtZQUN0RCxVQUFVLENBQUMsSUFBSSxDQUNYLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQ2pDLFFBQVEsQ0FDWCxDQUNKLENBQUE7WUFDRCxlQUFlLENBQUMsSUFBSSxDQUNoQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUNqQyxRQUFRLENBQ1gsQ0FDSixDQUFBO1FBQ0wsQ0FBQztRQUdELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUNYLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUssRUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FDaEIsQ0FDSixDQUFBO2dCQUNELGVBQWUsQ0FBQyxJQUFJLENBQ2hCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUssRUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FDaEIsQ0FDSixDQUFBO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDaEQsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ25ELENBQUE7Z0JBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDZixVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSyxDQUFDLEdBQUcsSUFBSTtxQkFDbEQsQ0FBQyxDQUFBO29CQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDbEQsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ25ELENBQUE7b0JBQ0QsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFlLENBQUMsQ0FBQTtnQkFDekMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUdGLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTzthQUNyQixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDMUQsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDaEIsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN0RCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDOUIsQ0FBQyxDQUNMLENBQUE7UUFHTCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUdoRSxJQUFJLFFBQVEsR0FBVyxFQUFFLENBQUE7UUFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELFFBQVEsR0FBRyxlQUFlLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLENBQUE7WUFDNUQsQ0FBQztRQUNMLENBQUM7UUFHRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87YUFDbkMsTUFBTSxDQUNILENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDTixLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU07WUFDckIsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FDMUM7YUFDQSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNYLElBQUksS0FBSyxDQUFDLFFBQVE7Z0JBQ2QsT0FBTyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUV6RCxPQUFPLENBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBVSxDQUFDO2dCQUNuQyxHQUFHO2dCQUNILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUMxQixDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFFTixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQTtRQUNwRCxNQUFNLFNBQVMsR0FBRyxVQUFVO2FBQ3ZCLEdBQUcsQ0FDQSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFNBQVM7WUFDaEIsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDYixDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNoQjthQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVmLE9BQU8sQ0FDSCxNQUFNO1lBQ04sU0FBUztZQUNULFFBQVE7WUFDUixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQixJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDaEMsUUFBUSxDQUNYLENBQUE7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyw4QkFBOEI7UUFDcEMsTUFBTSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxHQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFBO1FBQ3RCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFBO1FBRWxDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQTtRQUV0QixJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksMEJBQTBCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLE9BQU8sQ0FBQTtZQUNsRixDQUFDO1FBQ0wsQ0FBQztRQUVELElBQ0ksV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNwQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QixDQUFDO1lBQ0MsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0I7aUJBQ3ZDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFZixNQUFNLEdBQUcsdUJBQXVCLG1CQUFtQixJQUFJLENBQUE7UUFDM0QsQ0FBQzthQUFNLElBQUksY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxHQUFHLGtCQUFrQixDQUFBO1FBQy9CLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDTyxvQkFBb0I7UUFTMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQTtZQUNsQyxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUE7WUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQTtZQUNqRCxJQUFJLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxTQUFTO2dCQUN0QyxDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsR0FBRztnQkFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNSLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUE7WUFJeEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQzNDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUE7Z0JBQzdDLE9BQU8sQ0FDSCxHQUFHO29CQUNILFFBQVEsQ0FBQyxTQUFTO29CQUNsQixRQUFRO29CQUNSLGVBQWU7b0JBQ2YsR0FBRztvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO29CQUNsQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ2hDLENBQUMsUUFBUSxDQUFDLFNBQVM7d0JBQ2YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQzt3QkFDeEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNaLENBQUE7WUFDTCxDQUFDO1lBR0QsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFFbkQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVc7cUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNoQixPQUFPLENBQ0gscUJBQXFCO3dCQUNyQixHQUFHO3dCQUNILFVBQVUsQ0FBQyxnQkFBaUIsQ0FBQyxZQUFZO3dCQUN6QyxHQUFHO3dCQUNILFdBQVc7d0JBQ1gsR0FBRzt3QkFDSCxRQUFRLENBQUMsWUFBWTt3QkFDckIsR0FBRzt3QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWSxDQUM1QyxDQUFBO2dCQUNMLENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRWxCLE9BQU8sQ0FDSCxHQUFHO29CQUNILFFBQVEsQ0FBQyxTQUFTO29CQUNsQixRQUFRO29CQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7b0JBQ3ZDLEdBQUc7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxNQUFNO29CQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FDM0QsQ0FBQTtZQUNMLENBQUM7aUJBQU0sSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUU3RCxNQUFNLFNBQVMsR0FBRyxRQUFRO3FCQUNyQixlQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDN0MsSUFDSSxRQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUzt3QkFDcEMsY0FBYzt3QkFDbEIsUUFBUSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixFQUNwRCxDQUFDO3dCQUNDLGlCQUFpQjs0QkFDYixPQUFPO2dDQUNQLHFCQUFxQjtnQ0FDckIsR0FBRztnQ0FDSCxRQUFRLENBQUMscUJBQXFCO3FDQUN6QixtQkFBbUIsQ0FBQyxZQUFZO2dDQUNyQyxJQUFJO2dDQUNKLFFBQVEsQ0FBQyxxQkFBcUI7cUNBQ3pCLGtCQUFrQjtnQ0FDdkIsR0FBRyxDQUFBO29CQUNYLENBQUM7b0JBRUQsT0FBTyxDQUNILHFCQUFxQjt3QkFDckIsR0FBRzt3QkFDSCxRQUFRLENBQUMsZUFBZ0IsQ0FBQyxZQUFZO3dCQUN0QyxHQUFHO3dCQUNILFVBQVUsQ0FBQyxnQkFBaUIsQ0FBQyxZQUFZO3dCQUN6QyxHQUFHO3dCQUNILFdBQVc7d0JBQ1gsR0FBRzt3QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWSxDQUM1QyxDQUFBO2dCQUNMLENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRWxCLE9BQU8sQ0FDSCxHQUFHO29CQUNILFFBQVEsQ0FBQyxTQUFTO29CQUNsQixRQUFRO29CQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7b0JBQ3ZDLEdBQUc7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxNQUFNO29CQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FDM0QsQ0FBQTtZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFFSixNQUFNLGlCQUFpQixHQUNuQixRQUFRLENBQUMsc0JBQXVCLENBQUMsU0FBUyxDQUFBO2dCQUU5QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFBO2dCQUM1QyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsRUFDdEIsb0JBQW9CLEdBQUcsRUFBRSxDQUFBO2dCQUU3QixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEIsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLFdBQVc7eUJBQ25DLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUVoQixPQUFPLENBQ0gsYUFBYTs0QkFDYixHQUFHOzRCQUNILFVBQVUsQ0FBQyxZQUFZOzRCQUN2QixHQUFHOzRCQUNILFdBQVc7NEJBQ1gsR0FBRzs0QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWSxDQUM1QyxDQUFBO29CQUNMLENBQUMsQ0FBQzt5QkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBRWxCLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0I7eUJBQzdDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUVoQixPQUFPLENBQ0gscUJBQXFCOzRCQUNyQixHQUFHOzRCQUNILFVBQVUsQ0FBQyxnQkFBaUIsQ0FBQyxZQUFZOzRCQUN6QyxHQUFHOzRCQUNILGFBQWE7NEJBQ2IsR0FBRzs0QkFDSCxVQUFVLENBQUMsWUFBWSxDQUMxQixDQUFBO29CQUNMLENBQUMsQ0FBQzt5QkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3RCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixpQkFBaUIsR0FBRyxRQUFRO3lCQUN2QixlQUFnQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FDcEMsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFFWCxPQUFPLENBQ0gsYUFBYTs0QkFDYixHQUFHOzRCQUNILFVBQVUsQ0FBQyxZQUFZOzRCQUN2QixHQUFHOzRCQUNILFdBQVc7NEJBQ1gsR0FBRzs0QkFDSCxVQUFVLENBQUMsZ0JBQWlCLENBQUMsWUFBWSxDQUM1QyxDQUFBO29CQUNMLENBQUMsQ0FDSjt5QkFDQSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBRWxCLG9CQUFvQixHQUFHLFFBQVE7eUJBQzFCLGVBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUU3QyxPQUFPLENBQ0gscUJBQXFCOzRCQUNyQixHQUFHOzRCQUNILFVBQVUsQ0FBQyxnQkFBaUIsQ0FBQyxZQUFZOzRCQUN6QyxHQUFHOzRCQUNILGFBQWE7NEJBQ2IsR0FBRzs0QkFDSCxVQUFVLENBQUMsWUFBWSxDQUMxQixDQUFBO29CQUNMLENBQUMsQ0FBQzt5QkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3RCLENBQUM7Z0JBRUQsT0FBTyxDQUNILEdBQUc7b0JBQ0gsUUFBUSxDQUFDLFNBQVM7b0JBQ2xCLFFBQVE7b0JBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztvQkFDcEMsR0FBRztvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxNQUFNO29CQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDNUMsR0FBRztvQkFDSCxRQUFRLENBQUMsU0FBUztvQkFDbEIsUUFBUTtvQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDO29CQUN2QyxHQUFHO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDaEMsTUFBTTtvQkFDTixJQUFJLENBQUMsb0JBQW9CLENBQ3JCLG9CQUFvQixHQUFHLGlCQUFpQixDQUMzQyxDQUNKLENBQUE7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ08sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU07WUFDbkUsT0FBTyxFQUFFLENBQUE7UUFDYixPQUFPLENBQ0gsWUFBWTtZQUNaLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDcEUsQ0FBQTtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLHVCQUF1QjtRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQTtRQUMvQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDaEMsT0FBTyxDQUNILFlBQVk7Z0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7cUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNoQixJQUFJLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUMzQyxPQUFPLENBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQzs0QkFDckMsR0FBRzs0QkFDSCxRQUFRLENBQUMsVUFBVSxDQUFDLENBQ3ZCLENBQUE7b0JBQ0wsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLE9BQU8sQ0FDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDOzRCQUNyQyxHQUFHOzRCQUNGLFFBQVEsQ0FBQyxVQUFVLENBQVMsQ0FBQyxLQUFLOzRCQUNuQyxHQUFHOzRCQUNGLFFBQVEsQ0FBQyxVQUFVLENBQVMsQ0FBQyxLQUFLLENBQ3RDLENBQUE7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNsQixDQUFBO1FBRUwsT0FBTyxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDTywyQkFBMkI7UUFHakMsSUFBSSxNQUFNLEdBQXVCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUN0RCxLQUFLLEdBQXVCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFBO1FBQ3hELElBQ0ksQ0FBQyxNQUFNO1lBQ1AsQ0FBQyxLQUFLO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDaEQsQ0FBQztZQUNDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQTtZQUNoQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUE7UUFDbkMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQU1sRCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFDZixJQUNJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQztnQkFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ3pELENBQUM7Z0JBQ0MsTUFBTSxHQUFHLHlCQUF5QixDQUFBO1lBQ3RDLENBQUM7WUFFRCxJQUFJLEtBQUssSUFBSSxNQUFNO2dCQUNmLE9BQU8sQ0FDSCxNQUFNO29CQUNOLFVBQVU7b0JBQ1YsTUFBTTtvQkFDTixtQkFBbUI7b0JBQ25CLEtBQUs7b0JBQ0wsWUFBWSxDQUNmLENBQUE7WUFDTCxJQUFJLEtBQUs7Z0JBQ0wsT0FBTyxDQUNILE1BQU0sR0FBRyw0QkFBNEIsR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUMvRCxDQUFBO1lBQ0wsSUFBSSxNQUFNO2dCQUFFLE9BQU8sTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFBO1FBQzdELENBQUM7YUFBTSxJQUNILFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxjQUFjO1lBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSztZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFDbkQsQ0FBQztZQUNDLElBQUksS0FBSyxJQUFJLE1BQU07Z0JBQUUsT0FBTyxTQUFTLEdBQUcsS0FBSyxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUE7WUFDbkUsSUFBSSxLQUFLO2dCQUFFLE9BQU8sU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNuQyxJQUFJLE1BQU07Z0JBQUUsTUFBTSxJQUFJLG1DQUFtQyxFQUFFLENBQUE7UUFDL0QsQ0FBQzthQUFNLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUQsSUFBSSxLQUFLLElBQUksTUFBTTtnQkFBRSxPQUFPLFNBQVMsR0FBRyxLQUFLLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQTtZQUNuRSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ25DLElBQUksTUFBTTtnQkFBRSxPQUFPLG1CQUFtQixHQUFHLE1BQU0sQ0FBQTtRQUNuRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFELElBQUksS0FBSyxJQUFJLE1BQU07Z0JBQ2YsT0FBTyxDQUNILFVBQVU7b0JBQ1YsTUFBTTtvQkFDTixtQkFBbUI7b0JBQ25CLEtBQUs7b0JBQ0wsWUFBWSxDQUNmLENBQUE7WUFDTCxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxjQUFjLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQTtZQUN2RCxJQUFJLE1BQU07Z0JBQUUsT0FBTyxVQUFVLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQTtRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksS0FBSyxJQUFJLE1BQU07Z0JBQUUsT0FBTyxTQUFTLEdBQUcsS0FBSyxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUE7WUFDbkUsSUFBSSxLQUFLO2dCQUFFLE9BQU8sU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUNuQyxJQUFJLE1BQU07Z0JBQUUsT0FBTyxVQUFVLEdBQUcsTUFBTSxDQUFBO1FBQzFDLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0sseUJBQXlCO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNsRCxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLEtBQUssa0JBQWtCO29CQUNuQixPQUFPLDJCQUEyQixDQUFBO2dCQUN0QyxLQUFLLG1CQUFtQjtvQkFDcEIsT0FBTywwQkFBMEIsQ0FBQTtnQkFDckMsS0FBSyxZQUFZO29CQUNiLE9BQU8sZ0JBQWdCLENBQUE7WUFDL0IsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNPLG9CQUFvQjtRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQTtRQUVyQyxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUV6QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsSUFDSSxDQUFDLENBQ0csV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztnQkFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUN4QyxFQUNILENBQUM7Z0JBQ0MsTUFBTSxJQUFJLFlBQVksQ0FDbEIsOENBQThDLENBQ2pELENBQUE7WUFDTCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxZQUFZLENBQUMscUNBQXFDLENBQUMsQ0FBQTtZQUNqRSxDQUFDO1lBQ0QsZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4RSxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUE7UUFDaEMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDdkQsZ0JBQWdCLEdBQUcsY0FBYyxDQUFBO1FBQ3JDLENBQUM7UUFDRCxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsS0FBSyxrQkFBa0I7Z0JBQ25CLElBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTztvQkFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUN4QyxDQUFDO29CQUNDLElBQ0ksV0FBVyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFDeEQsQ0FBQzt3QkFDQyxPQUFPLENBQ0gsWUFBWSxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixDQUNyRCxDQUFBO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixPQUFPLHFCQUFxQixDQUFBO29CQUNoQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0MsT0FBTyxxQkFBcUIsQ0FBQTtnQkFDaEMsQ0FBQztxQkFBTSxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUM5QyxPQUFPLFlBQVksR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtnQkFDN0QsQ0FBQztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMxQyxPQUFPLGFBQWEsQ0FBQTtnQkFDeEIsQ0FBQztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQTtnQkFDYixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLGtDQUFrQyxFQUFFLENBQUE7Z0JBQ2xELENBQUM7WUFDTCxLQUFLLG1CQUFtQjtnQkFDcEIsSUFDSSxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztvQkFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBYztvQkFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUNsQyxDQUFDO29CQUNDLE9BQU8sYUFBYSxHQUFHLGdCQUFnQixDQUFBO2dCQUMzQyxDQUFDO3FCQUFNLElBQ0gsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztvQkFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUN2QyxDQUFDO29CQUNDLE9BQU8sYUFBYSxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO2dCQUM5RCxDQUFDO3FCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sRUFBRSxDQUFBO2dCQUNiLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksa0NBQWtDLEVBQUUsQ0FBQTtnQkFDbEQsQ0FBQztZQUNMLEtBQUssMkJBQTJCO2dCQUM1QixJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUN2QyxPQUFPLGFBQWEsR0FBRyxnQkFBZ0IsR0FBRyxjQUFjLENBQUE7Z0JBQzVELENBQUM7cUJBQU0sSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzNDLE9BQU8seUJBQXlCLENBQUE7Z0JBQ3BDLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksa0NBQWtDLEVBQUUsQ0FBQTtnQkFDbEQsQ0FBQztZQUNMLEtBQUssMkJBQTJCO2dCQUM1QixJQUNJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFDdkMsQ0FBQztvQkFDQyxPQUFPLGFBQWEsR0FBRyxnQkFBZ0IsR0FBRyxTQUFTLENBQUE7Z0JBQ3ZELENBQUM7cUJBQU0sSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzNDLE9BQU8sb0JBQW9CLENBQUE7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksa0NBQWtDLEVBQUUsQ0FBQTtnQkFDbEQsQ0FBQztZQUNMLEtBQUssbUJBQW1CO2dCQUNwQixJQUNJLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFDdkMsQ0FBQztvQkFDQyxPQUFPLENBQ0gsb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQixDQUNuQixDQUFBO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksa0NBQWtDLEVBQUUsQ0FBQTtnQkFDbEQsQ0FBQztZQUNMLEtBQUssZUFBZTtnQkFDaEIsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsT0FBTyxDQUNILGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixDQUN6RCxDQUFBO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksa0NBQWtDLEVBQUUsQ0FBQTtnQkFDbEQsQ0FBQztZQUNMO2dCQUNJLE9BQU8sRUFBRSxDQUFBO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNqRSxPQUFPLEVBQUUsQ0FBQTtRQUNiLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTzthQUN4QyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssS0FBSztvQkFDTixPQUFPLENBQ0gsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDOUMsQ0FBQTtnQkFDTCxLQUFLLElBQUk7b0JBQ0wsT0FBTyxDQUNILENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQzlDLENBQUE7Z0JBQ0w7b0JBQ0ksT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzFELENBQUM7UUFDTCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFZCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUNqQyxPQUFPLFVBQVUsR0FBRyxVQUFVLENBQUE7SUFDbEMsQ0FBQztJQUVTLCtCQUErQixDQUNyQyxTQUFpQixFQUNqQixRQUF3QjtRQUV4QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2hELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FDN0MsQ0FBQTtRQUVELE1BQU0sT0FBTyxHQUFxQixFQUFFLENBQUE7UUFDcEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDdEIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUN2QyxDQUNKLENBQUE7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FDUixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDUCxNQUFNLENBQUMsU0FBUztnQkFDaEIsU0FBUyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUM1QyxDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQTtRQUtELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBRXBCLE9BQU8sRUFBRSxDQUFBO1FBRWIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDNUQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUMxQixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDM0Q7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ1IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLHlCQUF5QixDQUFDLENBQUE7UUFDN0QsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQTtRQUV0QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDL0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFCLElBQUksYUFBYSxHQUNiLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUU3RCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNDLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFBO1lBQ3pELENBQUM7WUFFRCxJQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNqRSxDQUFDO2dCQUNmLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBR0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztZQUVPLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2hELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDUCxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FDakUsQ0FBQTtZQUNELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ2QsU0FBUyxFQUFFLGFBQWE7d0JBQ3hCLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUzs0QkFDMUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTOzRCQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLFNBQVMsRUFDVCxNQUFNLENBQUMsWUFBWSxDQUN0Qjt3QkFFUCxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87cUJBQzdCLENBQUMsQ0FBQTtnQkFDTixDQUFDLENBQUMsQ0FBQTtZQUNOLENBQUM7aUJBQU0sQ0FBQztnQkFDSixZQUFZLENBQUMsSUFBSSxDQUFDO29CQUNkLFNBQVMsRUFBRSxhQUFhO29CQUN4QixTQUFTLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLFNBQVMsRUFDVCxNQUFNLENBQUMsWUFBWSxDQUN0QjtvQkFFRCxPQUFPLEVBQUUsWUFBWTtpQkFDeEIsQ0FBQyxDQUFBO1lBQ04sQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxZQUFZLENBQUE7SUFDdkIsQ0FBQztJQUVTLHVCQUF1QixDQUM3QixTQUFpQixFQUNqQixRQUF3QjtRQUV4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzlDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FDN0MsQ0FBQTtRQUNELElBQUksVUFBVTtZQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3hCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDUCxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FDakUsQ0FBQTtRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQUEsQ0FBQyw2Q0FBNkM7UUFDbEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxDQUFBO1FBRXZELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUE7UUFDOUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUk1QyxJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN6RCxDQUFDO1lBQ0MsT0FBTyxVQUFVLENBQUE7UUFDckIsQ0FBQztRQUlELElBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxhQUFhO1lBQ3JELFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUN0RCxDQUFDO1lBR0MsT0FBTyxDQUNILGlCQUFpQjtnQkFDakIsY0FBYztxQkFDVCxHQUFHLENBQ0EsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQ3hEO3FCQUNBLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxDQUNQLENBQUE7UUFDTCxDQUFDO1FBRUQsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUdwRCxPQUFPLENBQ0gsaUJBQWlCO2dCQUNqQixjQUFjO3FCQUNULEdBQUcsQ0FDQSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0YsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDeEQ7cUJBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDZixHQUFHLENBQ04sQ0FBQTtRQUNMLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFNbEQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjO2lCQUNuQyxHQUFHLENBQ0EsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUNkLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQzNCLGFBQWEsQ0FBQyxZQUFZLENBQzdCLEVBQUUsQ0FDVjtpQkFDQSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFdEIsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLGtCQUFrQixpQkFBaUIsSUFBSSxDQUFBO1lBQ2xELENBQUM7WUFFRCxPQUFPLHlCQUF5QixpQkFBaUIsS0FBSyxDQUFBO1FBQzFELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFJcEQsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLGtCQUFrQixhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FDakQsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDakMsSUFBSSxDQUFBO1lBQ1QsQ0FBQztZQUVELE1BQU0saUJBQWlCLEdBQUcsY0FBYztpQkFDbkMsR0FBRyxDQUNBLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FDZCxRQUFRLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUNoQyxhQUFhLENBQUMsWUFBWSxDQUM3QixhQUFhLENBQ3JCO2lCQUNBLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN0QixPQUFPLHlCQUF5QixpQkFBaUIsS0FBSyxDQUFBO1FBQzFELENBQUM7UUFTRCxPQUFPLENBQ0gsaUJBQWlCO1lBQ2pCLGNBQWM7aUJBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2lCQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFCLElBQUksQ0FDUCxDQUFBO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsV0FBd0I7UUFFeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7UUFFOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFO2FBQzdCLE9BQU8sRUFBRTthQUNULE9BQU8sRUFBRTthQUNULE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDakIsS0FBSyxDQUFDLFNBQVMsQ0FBQzthQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUNmLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO2FBQ3ZCLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQzthQUNqQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFaEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQTtRQUUzRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRVMsZ0JBQWdCO1FBSXRCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CO29CQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFBO1lBQzdDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMxQyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7WUFDdEIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDakQsQ0FBQyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFrQixDQUN0QztvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUE7Z0JBRTdCLElBQUksQ0FBQyxXQUFXLENBQ1osTUFBTSxFQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsRUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxDQUNyQyxDQUFBO1lBQ0wsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDN0IsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztvQkFDdkQsQ0FBQyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzdCO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQTtnQkFFaEMsSUFBSSxDQUFDLGNBQWMsQ0FDZixTQUFTLEVBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxRQUFRO29CQUN2QyxDQUFDLENBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFpQztvQkFDckQsQ0FBQyxDQUFDLFNBQVMsRUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxRQUFRLEVBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLElBQUksQ0FDckMsQ0FBQTtnQkFDRCxJQUNJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssS0FBSztvQkFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsS0FBSyxNQUFNLEVBQ3BELENBQUM7b0JBQ0MsSUFBSSxDQUFDLG1CQUFtQixDQUNwQixTQUFTLEVBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxRQUFRO3dCQUN2QyxDQUFDLENBQUUsSUFBSSxDQUFDLFdBQVc7NkJBQ1osTUFBaUM7d0JBQ3hDLENBQUMsQ0FBQyxTQUFTLEVBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxFQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQ3JDLENBQUE7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2hDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBVSxDQUFDLFFBQVEsRUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxDQUNyQyxDQUFBO2dCQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO29CQUN0QixJQUFJLENBQUMsUUFBUSxDQUNULElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHO3dCQUNoQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRzt3QkFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQ3hCLENBQUEsQ0FBQyxpQ0FBaUM7WUFDM0MsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsQ0FDWCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsUUFBUSxFQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxJQUFJLENBQ3JDLENBQUE7WUFDTCxDQUFDO1lBR0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBRWpDLEVBQUU7d0JBRUYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDOzRCQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQ25CLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEVBQzNELElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQTt3QkFDTCxDQUFDOzZCQUFNLENBQUM7NEJBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUNsQixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUMzRCxJQUFJLENBQUMsS0FBSyxDQUNiLENBQUE7d0JBQ0wsQ0FBQztvQkFFTCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDOzRCQUN4QixJQUFJLENBQUMsU0FBUyxDQUNWLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEVBQzNELElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQTt3QkFDTCxDQUFDOzZCQUFNLENBQUM7NEJBQ0osSUFBSSxDQUFDLFFBQVEsQ0FDVCxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUMzRCxJQUFJLENBQUMsS0FBSyxDQUNiLENBQUE7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDO2dCQVdMLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztZQU9ELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBSXRDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVwQyxDQUFDO1lBR0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFJdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRXBDLENBQUM7WUFHRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN0QyxDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3RDLENBQUM7aUJBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLENBQUMsS0FBSyxDQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUN0QyxDQUFBO1lBQ0wsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FDL0MsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDSixJQUFJLENBQUMsUUFBUSxDQUNULElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSyxDQUFDLFFBQVMsQ0FBQyxHQUFHLENBQUMsRUFDckMsR0FBRyxDQUNOLENBQUE7b0JBQ0wsQ0FBQyxDQUNKLENBQUE7Z0JBRUwsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTO29CQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FDaEQsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDSixJQUFJLENBQUMsU0FBUyxDQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSyxDQUFDLFNBQVUsQ0FBQyxHQUFHLENBQUMsRUFDdEMsR0FBRyxDQUNOLENBQUE7b0JBQ0wsQ0FBQyxDQUNKLENBQUE7Z0JBRUwsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7b0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQzFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssQ0FBQyxpQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFDOUMsR0FBRyxDQUNOLENBQUE7b0JBQ0wsQ0FBQyxDQUFDLENBQUE7Z0JBRU4sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0I7b0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQzNDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLGtCQUFrQixDQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUssQ0FBQyxrQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFDL0MsR0FBRyxDQUNOLENBQUE7b0JBQ0wsQ0FBQyxDQUFDLENBQUE7WUFDVixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FDUixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FDaEMsQ0FBQTtnQkFDTCxDQUFDO3FCQUFNLElBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGtCQUFrQjtvQkFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLG1CQUFtQjtvQkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVk7b0JBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUk7d0JBQ3RCLDJCQUEyQjtvQkFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSTt3QkFDdEIsMkJBQTJCO29CQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssbUJBQW1CO29CQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUNoRCxDQUFDO29CQUNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU07d0JBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7NEJBQ3ZDLE1BQU0sVUFBVSxHQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dDQUN0QyxPQUFPLENBQ0gsS0FBSyxDQUFDLFFBQVE7cUNBQ1Qsc0JBQXNCLEtBQUssS0FBSyxDQUN4QyxDQUFBOzRCQUNMLENBQUMsQ0FBQyxDQUFBOzRCQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQ0FDZCxNQUFNLElBQUksWUFBWSxDQUNsQixJQUFJLEtBQUssNkJBQTZCLENBQ3pDLENBQUE7NEJBQ0wsQ0FBQzs0QkFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUN2QyxDQUFDLENBQUM7d0JBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQTtvQkFDZixJQUFJLENBQUMsT0FBTyxDQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFDMUIsU0FBUyxFQUNULFVBQVUsQ0FDYixDQUFBO29CQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQ3BELENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUM3QixDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBc0IsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hELGdCQUFnQixDQUFDLGtCQUFrQixDQUMvQixJQUFJLEVBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFVLENBQUMsSUFBSSxFQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FBQyxRQUFRLENBQ3pDLENBQUE7WUFDTCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQzVDLENBQUM7UUFpQkwsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyw0QkFBNEIsQ0FDeEMsV0FBd0I7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUM3QixNQUFNLElBQUksWUFBWSxDQUNsQixzREFBc0QsQ0FDekQsQ0FBQTtRQUVMLElBQ0ksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxrQkFBa0I7WUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssbUJBQW1CO1lBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLDJCQUEyQjtZQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSywyQkFBMkI7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssbUJBQW1CO1lBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLGVBQWUsQ0FBQztZQUNwRCxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7WUFFaEMsTUFBTSxJQUFJLHVDQUF1QyxFQUFFLENBQUE7UUFFdkQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUE7WUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO2dCQUNyRCxNQUFNLElBQUksZ0NBQWdDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQ3pDLElBQUksQ0FBQyxVQUFVLEVBQ2YsV0FBVyxFQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQzFDLENBQUE7UUFDRCxNQUFNLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQy9DLElBQUksQ0FBQyxVQUFVLEVBQ2YsV0FBVyxFQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQzdDLENBQUE7UUFDRCxNQUFNLDZCQUE2QixHQUMvQixJQUFJLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRSw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUN6QyxNQUFNLGdDQUFnQyxHQUNsQyxJQUFJLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN2RSxnQ0FBZ0MsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUU1QyxJQUFJLFVBQVUsR0FBVSxFQUFFLEVBQ3RCLFFBQVEsR0FBVSxFQUFFLENBQUE7UUFNeEIsSUFDSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzlDLENBQUM7WUFHQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUNyQixJQUFJLENBQUMseUNBQXlDLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFBO1lBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtZQUV2RCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDZCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO2dCQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUMzQixXQUFXLENBQUMsVUFBVSxDQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsYUFBYSxFQUNiLGFBQWEsQ0FBQyxZQUFZLENBQzdCLENBQ0osQ0FBQTtnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztvQkFFdEIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtnQkFFakMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLE1BQU0sR0FBRyxhQUFhLEVBQ3RCLGFBQWEsQ0FBQyxZQUFZLENBQzdCLENBQUE7Z0JBRUQsT0FBTyxHQUFHLGFBQWEsSUFBSSxXQUFXLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDcEQsS0FBSyxDQUNSLEVBQUUsQ0FBQTtZQUNQLENBQUMsQ0FDSixDQUFBO1lBRUQsVUFBVSxHQUFHLE1BQU0sSUFBSSxvQkFBa0IsQ0FDckMsSUFBSSxDQUFDLFVBQVUsRUFDZixXQUFXLENBQ2Q7aUJBQ0ksTUFBTSxDQUFDLFlBQVksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUM3QyxTQUFTLENBQUMsT0FBTyxDQUFDO2lCQUNsQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUM7aUJBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztpQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2lCQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDO2lCQUNqQixLQUFLLENBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUNuQztpQkFDQSxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUNuQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO2lCQUN4RCxVQUFVLEVBQUUsQ0FBQTtZQUVqQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtnQkFDbEIsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQTtnQkFDcEMsSUFBSSxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQkFDbEMsU0FBUyxHQUFHLFVBQVU7eUJBQ2pCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTt3QkFDbkIsT0FBTyxRQUFRLENBQUMsY0FBYzs2QkFDekIsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7NEJBQ25CLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixLQUFLLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFBOzRCQUMxRSxVQUFVLENBQUMsUUFBUSxDQUFDO2dDQUNoQixNQUFNLENBQ0YsT0FBTyxhQUFhLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRSxDQUN2RCxDQUFBOzRCQUNMLE9BQU8sR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQTt3QkFDeEUsQ0FBQyxDQUFDOzZCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDdEIsQ0FBQyxDQUFDO3lCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDckIsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixNQUFNLEdBQUcsYUFBYSxFQUN0QixRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDMUMsQ0FBQTtvQkFFRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtvQkFDckQsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FDM0IsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FDdEMsQ0FBQTtvQkFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUVoQixTQUFTLEdBQUcsR0FBRyxhQUFhLElBQ3hCLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFDL0IsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUE7b0JBQzdCLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLENBQUE7d0JBQ3BDLFNBQVM7NEJBQ0wsYUFBYTtnQ0FDYixHQUFHO2dDQUNILFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWTtnQ0FDdkMsNEJBQTRCLENBQUE7b0JBQ3BDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFO3FCQUMxQixrQkFBa0IsQ0FBQztvQkFDaEIsOEJBQThCLEVBQUUsU0FBUztpQkFDNUMsQ0FBQztxQkFDRCxhQUFhLENBQUMsVUFBVSxDQUFDO3FCQUN6QixjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDcEMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBRXhCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLG1CQUFtQixDQUFDLElBQUksQ0FDMUQsVUFBVSxDQUNiLENBQUE7WUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLGdDQUFnQyxDQUNwRCxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN2QixJQUFJLENBQUMsV0FBVyxDQUNuQixDQUFBO1lBQ0QsUUFBUSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQzVCLFVBQVUsRUFDVixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FDaEMsQ0FBQTtZQUdELElBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEtBQUssSUFBSTtnQkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUMxQyxDQUFDO2dCQUNDLE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQ25DLE1BQU0sRUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQ3JDLFFBQVEsQ0FDWCxDQUFBO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFBO2dCQUM1RCxNQUFNLGFBQWEsR0FDZixRQUFRLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFBO2dCQUU3QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO29CQUNqRCxDQUFDLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQWtCLENBQ3RDO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQTtnQkFDN0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztvQkFDdkQsQ0FBQyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzdCO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQTtnQkFFaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFO3FCQUN6QyxNQUFNLENBQUMsYUFBYSxDQUFDO3FCQUNyQixJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQztxQkFDbkMsY0FBYyxDQUFDO29CQUNaLE1BQU0sRUFBRSxNQUFNO3dCQUNWLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNkLE1BQU0sRUFDTixRQUFRLENBQUMsWUFBWSxDQUN4Qjt3QkFDSCxDQUFDLENBQUMsU0FBUztvQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO3dCQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFDdEIsUUFBUSxDQUFDLFlBQVksQ0FDeEI7d0JBQ0gsQ0FBQyxDQUFDLFNBQVM7b0JBQ2YsU0FBUyxFQUFFLFNBQVM7d0JBQ2hCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNkLFNBQVMsRUFDVCxRQUFRLENBQUMsWUFBWSxDQUN4Qjt3QkFDSCxDQUFDLENBQUMsU0FBUztvQkFDZixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXO29CQUN6QyxvQkFBb0IsRUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0I7aUJBQzVDLENBQUMsQ0FBQTtnQkFDTixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sbUJBQW1CLEdBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQ0FBaUMsQ0FDcEUsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxDQUNmLENBQUE7b0JBQ0wsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUN4QixNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FDL0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUNyQyxDQUFBO3dCQUNELElBQUksa0JBQWtCLEVBQUUsQ0FBQzs0QkFDckIsTUFBTSxLQUFLLEdBQ1Asa0JBQWtCLENBQUMsT0FBTyxLQUFLLFNBQVM7Z0NBQ3BDLENBQUMsQ0FBQyxJQUFJO2dDQUNOLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUE7NEJBQ3BDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO3dCQUMxQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFBO2dCQUNOLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FDTCxDQUFBO1FBQ0wsQ0FBQztRQUVELE9BQU87WUFDSCxHQUFHLEVBQUUsVUFBVTtZQUNmLFFBQVEsRUFBRSxRQUFRO1NBQ3JCLENBQUE7SUFDTCxDQUFDO0lBRVMseUNBQXlDLENBQy9DLFdBQW1CO1FBR25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFBO1FBQy9DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3JDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ25CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2xDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDM0QsTUFBTSxNQUFNLEdBQ1IsS0FBSyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDM0QsT0FBTyxDQUNILElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO29CQUN4QixHQUFHO29CQUNILElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxDQUFDLFVBQVUsQ0FDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLFNBQVMsRUFDVCxNQUFPLENBQUMsWUFBWSxDQUN2QixDQUNKLENBQ0osQ0FBQTtZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDM0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNQLE1BQU0sQ0FBQyxTQUFTLEtBQUssYUFBYTtvQkFDbEMsTUFBTSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQ3pDO29CQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFBO2dCQUV6RCxPQUFPLEVBQUUsQ0FBQTtZQUNiLENBQUM7UUFDTCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFZixNQUFNLGFBQWEsR0FBcUIsRUFBRSxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQzlDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDbEMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUMzRCxNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUMzRCxhQUFhLENBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7b0JBQ3BCLEdBQUc7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FDUCxXQUFXLENBQUMsVUFBVSxDQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsU0FBUyxFQUNULE1BQU8sQ0FBQyxZQUFZLENBQ3ZCLENBQ0osQ0FDUixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMvQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzNCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDUCxNQUFNLENBQUMsU0FBUyxLQUFLLGFBQWE7b0JBQ2xDLE1BQU0sQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUN6QyxFQUNILENBQUM7b0JBQ0MsYUFBYSxDQUNULElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FDakQsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDSixhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUMxRCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQXdCO1FBQ25ELE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDdEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDckUsTUFBTSxZQUFZLEdBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUMvQixDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ1osSUFBSSw0QkFBNEIsR0FDNUIsU0FBUyxDQUFBO1FBQ2IsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLElBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFDaEMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQzFELENBQUM7WUFDQyxJQUFJLENBQUM7Z0JBQ0QsNEJBQTRCO29CQUN4QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUMvQzt3QkFDSSxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO3dCQUN0QyxLQUFLLEVBQUUsT0FBTzt3QkFDZCxRQUFRLEVBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhOzRCQUNoQyxZQUFZLENBQUMsUUFBUTs0QkFDckIsSUFBSTtxQkFDWCxFQUNELFdBQVcsQ0FDZCxDQUFBO2dCQUNMLElBQ0ksNEJBQTRCO29CQUM1QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUN2Qyw0QkFBNEIsQ0FDL0IsRUFDSCxDQUFDO29CQUNDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDMUQsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzdCLE1BQU0sS0FBSyxDQUFBO2dCQUNmLENBQUM7Z0JBQ0QsVUFBVSxHQUFHLElBQUksQ0FBQTtZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRTlELElBQ0ksQ0FBQyxVQUFVO1lBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFDaEMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQzFELENBQUM7WUFDQyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FDL0M7b0JBQ0ksVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTztvQkFDdEMsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO29CQUMxQixRQUFRLEVBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhO3dCQUNoQyxZQUFZLENBQUMsUUFBUTt3QkFDckIsSUFBSTtvQkFDUixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2lCQUMxQyxFQUNELDRCQUE0QixFQUM1QixXQUFXLENBQ2QsQ0FBQTtZQUNMLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzdCLE1BQU0sS0FBSyxDQUFBO2dCQUNmLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQTtJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDTyxrQkFBa0IsQ0FDeEIsYUFBMEM7UUFFMUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3JELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ08sZUFBZSxDQUFDLEdBQVE7UUFDOUIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUM1RCxPQUFPLEdBQUcsQ0FBQTtRQUVkLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNPLGlCQUFpQjtRQUN2QixPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRVMsV0FBVyxDQUNqQixNQUE4QixFQUM5QixRQUF3QixFQUN4QixLQUFhLEVBQ2IsV0FBb0I7UUFFcEIsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUs7Z0JBQUUsU0FBUTtZQUVoRSxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUE7WUFDaEUsTUFBTSxNQUFNLEdBQ1IsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQzNELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFFcEUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVE7Z0JBQzlCLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFakUsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFBO1lBRWpELENBQUM7aUJBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsV0FBVyxDQUFFLGFBQWE7Z0JBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQTJCLEVBQ3JDLFFBQVEsRUFDUixLQUFLLEVBQ0wsWUFBWSxDQUNmLENBQUE7WUFlTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFUyxjQUFjLENBQ3BCLFNBQW9DLEVBQ3BDLFNBQTZDLEVBQzdDLFFBQXdCLEVBQ3hCLEtBQWEsRUFDYixXQUFvQjtRQUVwQixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU07UUFFdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUM1QyxNQUFNLGFBQWEsR0FBSSxTQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ3RELE1BQU0sWUFBWSxHQUFHLFdBQVc7Z0JBQzVCLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFlBQVk7Z0JBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUE7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNwRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUTtnQkFDbkIsTUFBTSxJQUFJLDJCQUEyQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVqRSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxjQUFjLENBQ2YsYUFBYSxFQUNiLE9BQU8sU0FBUyxLQUFLLFFBQVE7b0JBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO29CQUNuRCxDQUFDLENBQUMsU0FBUyxFQUNmLFFBQVEsRUFDUixLQUFLLEVBQ0wsWUFBWSxDQUNmLENBQUE7WUFDTCxDQUFDO2lCQUFNLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQzVELFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQ2hCLEtBQUssRUFDTCxTQUFTLENBQ1osQ0FBQTtnQkFDRCxJQUNJLGFBQWEsS0FBSyxJQUFJO29CQUN0QixPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQ25DLENBQUM7b0JBQ0MsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUN6QyxDQUFDO3lCQUFNLENBQUM7d0JBRUosSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7NEJBQ1osSUFBSSxFQUFFLE1BQU07NEJBQ1osTUFBTSxFQUFFLElBQUk7NEJBQ1osU0FBUyxFQUNMLFNBQVM7Z0NBQ1QsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUSxDQUFDLGFBQWE7Z0NBQ3JELENBQUMsQ0FBRSxTQUFTLENBQ04sWUFBWSxDQUNZO2dDQUM5QixDQUFDLENBQUMsU0FBUzs0QkFDbkIsS0FBSyxFQUFFLFNBQVM7NEJBQ2hCLFdBQVcsRUFBRSxLQUFLOzRCQUNsQixnQkFBZ0IsRUFBRSxRQUFRO3lCQUM3QixDQUFDLENBQUE7d0JBRUYsSUFDSSxTQUFTOzRCQUNULE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsRUFDN0MsQ0FBQzs0QkFDQyxJQUFJLENBQUMsV0FBVyxDQUFFLGFBQWE7NEJBQzNCLFNBQVMsQ0FDTCxZQUFZLENBQ1csRUFDM0IsUUFBUSxDQUFDLHFCQUFxQixFQUM5QixTQUFTLENBQ1osQ0FBQTt3QkFDTCxDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUNJLE9BQU8sYUFBYSxLQUFLLFFBQVE7b0JBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEtBQUssTUFBTSxFQUNwRCxDQUFDO29CQUNDLElBQUksQ0FBQyxjQUFjLENBQ2YsYUFBYSxFQUNiLE9BQU8sU0FBUyxLQUFLLFFBQVE7d0JBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNkLFNBQVMsRUFDVCxRQUFRLENBQUMsWUFBWSxDQUN4Qjt3QkFDSCxDQUFDLENBQUMsU0FBUyxFQUNmLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxFQUNULFNBQVMsQ0FDWixDQUFBO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRVMsbUJBQW1CLENBQ3pCLFNBQW9DLEVBQ3BDLFNBQTZDLEVBQzdDLFFBQXdCLEVBQ3hCLEtBQWEsRUFDYixXQUFvQjtRQUVwQixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU07UUFFdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUM1QyxNQUFNLGFBQWEsR0FBSSxTQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ3RELE1BQU0sWUFBWSxHQUFHLFdBQVc7Z0JBQzVCLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFlBQVk7Z0JBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUE7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNwRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUTtnQkFDbkIsTUFBTSxJQUFJLDJCQUEyQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVqRSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsYUFBYSxFQUNiLE9BQU8sU0FBUyxLQUFLLFFBQVE7b0JBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO29CQUNuRCxDQUFDLENBQUMsU0FBUyxFQUNmLFFBQVEsRUFDUixLQUFLLEVBQ0wsWUFBWSxDQUNmLENBQUE7WUFDTCxDQUFDO2lCQUFNLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQzVELFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQ2hCLEtBQUssRUFDTCxTQUFTLENBQ1osQ0FBQTtnQkFFRCxJQUNJLGFBQWEsS0FBSyxJQUFJO29CQUN0QixPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQ25DLENBQUM7b0JBQ0MsUUFBUSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQ2pELENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ2QsSUFBSSxzQkFBc0IsR0FDdEIsU0FBUzs0QkFDVCxHQUFHOzRCQUNILGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTt3QkFDaEQsc0JBQXNCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQ3RCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUNoQixTQUFTLEVBQ1Qsc0JBQXNCLENBQ3pCLENBQUE7d0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzdCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLHNCQUFzQixDQUNsRCxDQUFBO3dCQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQ0FDWixJQUFJLEVBQUUsTUFBTTtnQ0FDWixNQUFNLEVBQUUsSUFBSTtnQ0FDWixLQUFLLEVBQUUsc0JBQXNCO2dDQUM3QixXQUFXLEVBQUUsU0FBUztnQ0FDdEIsU0FBUyxFQUFFLFNBQVM7Z0NBQ3BCLGdCQUFnQixFQUFFLGFBQWE7NkJBQ2xDLENBQUMsQ0FBQTt3QkFDTixDQUFDO3dCQUVELElBQ0ksU0FBUzs0QkFDVCxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxRQUFRLEVBQzdDLENBQUM7NEJBQ0MsSUFBSSxDQUFDLFdBQVcsQ0FBRSxhQUFhOzRCQUMzQixTQUFTLENBQ0wsWUFBWSxDQUNXLEVBQzNCLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxDQUNaLENBQUE7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDLENBQ0osQ0FBQTtnQkFDTCxDQUFDO2dCQUVELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsYUFBYSxFQUNiLE9BQU8sU0FBUyxLQUFLLFFBQVE7d0JBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNkLFNBQVMsRUFDVCxRQUFRLENBQUMsWUFBWSxDQUN4Qjt3QkFDSCxDQUFDLENBQUMsU0FBUyxFQUNmLFFBQVEsQ0FBQyxxQkFBcUIsRUFDOUIsU0FBUyxFQUNULFNBQVMsQ0FDWixDQUFBO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRVMsVUFBVSxDQUNoQixLQUE0QixFQUM1QixRQUF3QixFQUN4QixLQUFhLEVBQ2IsV0FBb0I7UUFFcEIsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTO2dCQUFFLFNBQVE7WUFFdEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1lBQ2hFLE1BQU0sTUFBTSxHQUNSLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMzRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDakUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBRXBFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRO2dCQUM5QixNQUFNLElBQUksMkJBQTJCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBRWpFLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxTQUFTLEdBQ1QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtvQkFDMUIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxHQUFHLENBQVMsQ0FBQyxTQUFTO29CQUMvQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNwQixTQUFTO29CQUNMLFNBQVMsS0FBSyxNQUFNO3dCQUNwQixTQUFTLEtBQUssTUFBTTt3QkFDcEIsU0FBUyxLQUFLLENBQUMsQ0FBQzt3QkFDWixDQUFDLENBQUMsTUFBTTt3QkFDUixDQUFDLENBQUMsS0FBSyxDQUFBO2dCQUNmLElBQUksS0FBSyxHQUNMLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7b0JBQzFCLENBQUMsQ0FBRSxLQUFLLENBQUMsR0FBRyxDQUFTLENBQUMsS0FBSztvQkFDM0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtnQkFDbkIsS0FBSztvQkFDRCxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssT0FBTzt3QkFDNUIsQ0FBQyxDQUFDLGFBQWE7d0JBQ2YsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNOzRCQUNqQyxDQUFDLENBQUMsWUFBWTs0QkFDZCxDQUFDLENBQUMsU0FBUyxDQUFBO2dCQUVuQixJQUFJLFNBQVMsR0FBRyxHQUFHLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQTtnQkFDMUMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FDbkMsQ0FBQTtvQkFDRCxJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUVaLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLENBQ3RCLENBQUE7d0JBQ0QsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7b0JBQ25DLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUE7b0JBQzFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFaEQsQ0FBQztpQkFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxVQUFVLENBQ1gsS0FBSyxDQUFDLEdBQUcsQ0FBMEIsRUFDbkMsUUFBUSxFQUNSLEtBQUssRUFDTCxZQUFZLENBQ2YsQ0FBQTtZQUNMLENBQUM7aUJBQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxTQUFTLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDNUQsU0FBUyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUN0QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDaEIsS0FBSyxFQUNMLFNBQVMsQ0FDWixDQUFBO2dCQUtELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUM3QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQ3JDLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxNQUFNO3dCQUNaLE1BQU0sRUFBRSxLQUFLO3dCQUNiLEtBQUssRUFBRSxTQUFTO3dCQUNoQixXQUFXLEVBQUUsS0FBSzt3QkFDbEIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLGdCQUFnQixFQUFFLFFBQVE7cUJBQzdCLENBQUMsQ0FBQTtnQkFDTixDQUFDO2dCQUNELElBQUksQ0FBQyxVQUFVLENBQ1gsS0FBSyxDQUFDLEdBQUcsQ0FBMEIsRUFDbkMsUUFBUSxDQUFDLHFCQUFxQixFQUM5QixTQUFTLENBQ1osQ0FBQTtZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVTLFVBQVUsQ0FDaEIsS0FBNEIsRUFDNUIsUUFBd0IsRUFDeEIsS0FBYSxFQUNiLFdBQW9CO1FBRXBCLElBQUksU0FBUyxHQUFXLEVBQUUsQ0FBQTtRQUUxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixTQUFTO2dCQUNMLEdBQUc7b0JBQ0gsS0FBSzt5QkFDQSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTt3QkFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQ2xCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsQ0FDZCxDQUFBO29CQUNMLENBQUMsQ0FBQzt5QkFDRCxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7eUJBQ2xDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUM7eUJBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2pCLEdBQUcsQ0FBQTtRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFBO1lBQ2hDLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtvQkFBRSxTQUFRO2dCQUU3RCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUE7Z0JBQ2hFLE1BQU0sTUFBTSxHQUNSLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDM0QsTUFBTSxLQUFLLEdBQ1AsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUN2RCxNQUFNLFFBQVEsR0FDVixRQUFRLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBRXZELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRO29CQUM5QixNQUFNLElBQUksMkJBQTJCLENBQ2pDLFlBQVksRUFDWixRQUFRLENBQ1gsQ0FBQTtnQkFFTCxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNULElBQUksU0FBUyxHQUFHLEdBQUcsS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFBO29CQUMxQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzNDLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQTtvQkFDMUMsQ0FBQztvQkFJRCxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQy9CLElBQUksZUFBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUM5QyxjQUFjLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQTtvQkFDckMsQ0FBQztvQkFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDckIsY0FBYyxHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FDL0MsTUFBTSxDQUFDLFdBQVcsRUFDbEIsY0FBYyxDQUNqQixDQUFBO29CQUNMLENBQUM7b0JBSUQsRUFBRTtvQkFzQkYsRUFBRTtvQkFRRixhQUFhLENBQUMsSUFBSSxDQUNkLElBQUksQ0FBQyw4QkFBOEIsQ0FDL0IsSUFBSSxDQUFDLDBCQUEwQixDQUMzQixTQUFTLEVBQ1QsY0FBYyxDQUNqQixDQUNKLENBRUosQ0FBQTtnQkFJTCxDQUFDO3FCQUFNLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQ0wsWUFBWSxDQUNmLENBQUE7b0JBQ0QsSUFBSSxTQUFTO3dCQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ2hELENBQUM7cUJBQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFHbEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ2pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUNyQyxDQUFBO3dCQUNELElBQUksZUFBZSxFQUFFLENBQUM7NEJBQ2xCLFNBQVE7d0JBQ1osQ0FBQztvQkFDTCxDQUFDO29CQUVELElBQUksZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUM3QyxJQUNJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVTs0QkFDOUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQ2hDLENBQUM7NEJBQ0MsTUFBTSxXQUFXLEdBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBOzRCQUU5QyxNQUFNLEVBQUUsR0FBc0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBOzRCQUM3QyxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dDQUM3QixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztxQ0FDaEIsSUFBSSxDQUNELFFBQVEsQ0FBQyxhQUFhLEVBQ3RCLFFBQVEsQ0FBQyxhQUFhLENBQ3pCO3FDQUNBLEtBQUssQ0FDRixRQUFRLENBQUMsV0FBVztxQ0FDZixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQ0FDWixPQUFPLEdBQ0gsUUFBUSxDQUFDLGFBQ2IsSUFDSSxNQUFNLENBQUMsWUFDWCxNQUFNLEtBQUssSUFDUCxNQUFNLENBQUMsZ0JBQWlCO3lDQUNuQixZQUNULEVBQUUsQ0FBQTtnQ0FDTixDQUFDLENBQUM7cUNBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUFBOzRCQUNULENBQUM7aUNBQU0sSUFBSSxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdkMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7cUNBQ2hCLElBQUksQ0FDRCxRQUFRLENBQUMsZUFBZ0IsQ0FBQyxhQUFhLEVBQ3ZDLFFBQVEsQ0FBQyxlQUFnQixDQUFDLGFBQWEsQ0FDMUM7cUNBQ0EsS0FBSyxDQUNGLFFBQVE7cUNBQ0gsZUFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3BDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0NBQ1AsT0FBTyxHQUNILFFBQVEsQ0FBQyxlQUFnQjt5Q0FDcEIsYUFDVCxJQUNJLE1BQU0sQ0FBQyxZQUNYLE1BQU0sS0FBSyxJQUNQLE1BQU0sQ0FBQyxnQkFBaUI7eUNBQ25CLFlBQ1QsRUFBRSxDQUFBO2dDQUNOLENBQUMsQ0FDSjtxQ0FDQSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQ3JCLENBQUE7NEJBQ1QsQ0FBQztpQ0FBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQ0FDOUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7cUNBQ2hCLElBQUksQ0FDRCxRQUFRLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUNyQyxRQUFRLENBQUMscUJBQXFCO3FDQUN6QixTQUFTLENBQ2pCO3FDQUNBLEtBQUssQ0FDRixRQUFRO3FDQUNILGVBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQ0FDUCxPQUFPLEdBQ0gsUUFBUTt5Q0FDSCxxQkFBcUI7eUNBQ3JCLFNBQ1QsSUFDSSxNQUFNLENBQUMsWUFDWCxNQUFNLEtBQUssSUFDUCxNQUFNLENBQUMsZ0JBQWlCO3lDQUNuQixZQUNULEVBQUUsQ0FBQTtnQ0FDTixDQUFDLENBQ0o7cUNBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUFBOzRCQUNULENBQUM7aUNBQU0sQ0FBQztnQ0FDSixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRCxDQUN6RCxDQUFBOzRCQUNMLENBQUM7NEJBSUQsSUFBSSxDQUFDLFFBQVEsQ0FDVCxFQUFFLENBQUMsTUFBTSxFQUFFO2dDQUNQLEdBQUc7Z0NBQ0gsV0FBVztnQ0FDWCxHQUFHO2dDQUNILFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ2pDLENBQUE7d0JBQ0wsQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLElBQ0ksUUFBUSxDQUFDLFdBQVc7Z0NBQ3BCLENBQUMsUUFBUSxDQUFDLFVBQVU7b0NBQ2hCLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFDL0IsQ0FBQztnQ0FDQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQTtnQ0FFNUMsYUFBYSxDQUFDLElBQUksQ0FDZCxJQUFJLENBQUMsOEJBQThCLENBQy9CLElBQUksQ0FBQywwQkFBMEIsQ0FDM0IsU0FBUyxFQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FDYixDQUNKLENBQ0osQ0FBQTs0QkFDTCxDQUFDO2lDQUFNLENBQUM7Z0NBQ0osTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsQ0FDekQsQ0FBQTs0QkFDTCxDQUFDO3dCQUNMLENBQUM7b0JBQ0wsQ0FBQzt5QkFBTSxDQUFDO3dCQUVKLElBQUksU0FBUyxHQUNULEtBQUs7NEJBQ0wsR0FBRzs0QkFDSCxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQzNDLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQ2hCLEtBQUssRUFDTCxTQUFTLENBQ1osQ0FBQTt3QkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDN0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUNyQyxDQUFBO3dCQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQ0FDWixJQUFJLEVBQUUsT0FBTztnQ0FDYixNQUFNLEVBQUUsS0FBSztnQ0FDYixTQUFTLEVBQUUsU0FBUztnQ0FDcEIsS0FBSyxFQUFFLFNBQVM7Z0NBQ2hCLFdBQVcsRUFBRSxLQUFLO2dDQUNsQixnQkFBZ0IsRUFBRSxRQUFROzZCQUM3QixDQUFDLENBQUE7d0JBQ04sQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNO2dDQUN6QixTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQTt3QkFDaEMsQ0FBQzt3QkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQ1YsUUFBUSxDQUFDLHFCQUFxQixFQUM5QixTQUFTLENBQ1osQ0FBQTt3QkFDRCxJQUFJLFNBQVMsRUFBRSxDQUFDOzRCQUNaLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7d0JBRWpDLENBQUM7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUNELFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNwQixDQUFDO0NBQ0osQ0FBQTtBQTlwSVksa0JBQWtCO0lBRDlCLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7R0FDcEIsa0JBQWtCLENBOHBJOUI7O0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5RkFBeUYiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuaW1wb3J0IHsgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIgfSBmcm9tIFwiLi90cmFuc2Zvcm1lci9SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lclwiXG5pbXBvcnQgeyBPYmplY3RMaXRlcmFsIH0gZnJvbSBcIi4uL2NvbW1vbi9PYmplY3RMaXRlcmFsXCJcbmltcG9ydCB7IFBlc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9QZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3JcIlxuaW1wb3J0IHsgTm9WZXJzaW9uT3JVcGRhdGVEYXRlQ29sdW1uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTm9WZXJzaW9uT3JVcGRhdGVEYXRlQ29sdW1uRXJyb3JcIlxuaW1wb3J0IHsgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciB9IGZyb20gXCIuLi9lcnJvci9PcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yXCJcbmltcG9ydCB7IE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvclwiXG5pbXBvcnQgeyBKb2luQXR0cmlidXRlIH0gZnJvbSBcIi4vSm9pbkF0dHJpYnV0ZVwiXG5pbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZEF0dHJpYnV0ZVwiXG5pbXBvcnQgeyBSZWxhdGlvbkNvdW50QXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24tY291bnQvUmVsYXRpb25Db3VudEF0dHJpYnV0ZVwiXG5pbXBvcnQgeyBSZWxhdGlvbklkTG9hZGVyIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZExvYWRlclwiXG5pbXBvcnQgeyBSZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lclwiXG5pbXBvcnQgeyBSZWxhdGlvbkNvdW50TG9hZGVyIH0gZnJvbSBcIi4vcmVsYXRpb24tY291bnQvUmVsYXRpb25Db3VudExvYWRlclwiXG5pbXBvcnQgeyBSZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vcmVsYXRpb24tY291bnQvUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lclwiXG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIlxuLyogKi9cbi8qICovXG4gIFxuaW1wb3J0IHsgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvciB9IGZyb20gXCIuLi9lcnJvci9Mb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yXCJcbi8qICovXG4vKiAqL1xuICBcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4vU2VsZWN0UXVlcnlcIlxuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRW50aXR5TWV0YWRhdGFcIlxuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGFcIlxuaW1wb3J0IHsgT3JkZXJCeUNvbmRpdGlvbiB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvT3JkZXJCeUNvbmRpdGlvblwiXG5pbXBvcnQgeyBRdWVyeUV4cHJlc3Npb25NYXAgfSBmcm9tIFwiLi9RdWVyeUV4cHJlc3Npb25NYXBcIlxuaW1wb3J0IHsgRW50aXR5VGFyZ2V0IH0gZnJvbSBcIi4uL2NvbW1vbi9FbnRpdHlUYXJnZXRcIlxuaW1wb3J0IHsgUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vcXVlcnktcnVubmVyL1F1ZXJ5UnVubmVyXCJcbmltcG9ydCB7IFdoZXJlRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tIFwiLi9XaGVyZUV4cHJlc3Npb25CdWlsZGVyXCJcbmltcG9ydCB7IEJyYWNrZXRzIH0gZnJvbSBcIi4vQnJhY2tldHNcIlxuaW1wb3J0IHsgUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMgfSBmcm9tIFwiLi4vY2FjaGUvUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnNcIlxuaW1wb3J0IHsgT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3JcIlxuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyT3B0aW9uIH0gZnJvbSBcIi4vU2VsZWN0UXVlcnlCdWlsZGVyT3B0aW9uXCJcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIlxuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vZHJpdmVyL0RyaXZlclV0aWxzXCJcbmltcG9ydCB7IEVudGl0eU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5Tm90Rm91bmRFcnJvclwiXG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIlxuaW1wb3J0IHsgRmluZE1hbnlPcHRpb25zIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kTWFueU9wdGlvbnNcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNTZWxlY3QgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zU2VsZWN0XCJcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvUmVsYXRpb25NZXRhZGF0YVwiXG5pbXBvcnQgeyBGaW5kT3B0aW9uc09yZGVyIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc09yZGVyXCJcbmltcG9ydCB7IEZpbmRPcHRpb25zV2hlcmUgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNVdGlscyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNVdGlsc1wiXG5pbXBvcnQgeyBGaW5kT3B0aW9uc1JlbGF0aW9ucyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNSZWxhdGlvbnNcIlxuaW1wb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9IGZyb20gXCIuLi91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnNcIlxuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9Pcm1VdGlsc1wiXG5pbXBvcnQgeyBFbnRpdHlQcm9wZXJ0eU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yXCJcbi8qICovXG4vKiAqL1xuICBcbmltcG9ydCB7IEluc3RhbmNlQ2hlY2tlciB9IGZyb20gXCIuLi91dGlsL0luc3RhbmNlQ2hlY2tlclwiXG5pbXBvcnQgeyBDTEFTUyB9IGZyb20gXCJ0eXBlc2NyaXB0LWNsYXNzLWhlbHBlcnMvYnJvd3NlclwiXG5cbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG5AQ0xBU1MuTkFNRSgnU2VsZWN0UXVlcnlCdWlsZGVyJylcbmV4cG9ydCBjbGFzcyBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5IGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD5cbiAgICBleHRlbmRzIFF1ZXJ5QnVpbGRlcjxFbnRpdHk+XG4gICAgaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb25CdWlsZGVyXG57XG4gICAgcmVhZG9ubHkgXCJAaW5zdGFuY2VvZlwiID0gU3ltYm9sLmZvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlclwiKVxuXG4gICAgcHJvdGVjdGVkIGZpbmRPcHRpb25zOiBGaW5kTWFueU9wdGlvbnMgPSB7fVxuICAgIHByb3RlY3RlZCBzZWxlY3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgcHJvdGVjdGVkIGpvaW5zOiB7XG4gICAgICAgIHR5cGU6IFwiaW5uZXJcIiB8IFwibGVmdFwiXG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgcGFyZW50QWxpYXM6IHN0cmluZ1xuICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiBSZWxhdGlvbk1ldGFkYXRhXG4gICAgICAgIHNlbGVjdDogYm9vbGVhblxuICAgICAgICBzZWxlY3Rpb246IEZpbmRPcHRpb25zU2VsZWN0PGFueT4gfCB1bmRlZmluZWRcbiAgICB9W10gPSBbXVxuICAgIHByb3RlY3RlZCBjb25kaXRpb25zOiBzdHJpbmcgPSBcIlwiXG4gICAgcHJvdGVjdGVkIG9yZGVyQnlzOiB7XG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgZGlyZWN0aW9uOiBcIkFTQ1wiIHwgXCJERVNDXCJcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIlxuICAgIH1bXSA9IFtdXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9uTWV0YWRhdGFzOiBSZWxhdGlvbk1ldGFkYXRhW10gPSBbXVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBTUUwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzcWwgPSB0aGlzLmNyZWF0ZUNvbW1lbnQoKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVDdGVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlU2VsZWN0RXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUpvaW5FeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVIYXZpbmdFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlT3JkZXJCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMaW1pdE9mZnNldEV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMb2NrRXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCA9IHNxbC50cmltKClcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5zdWJRdWVyeSkgc3FsID0gXCIoXCIgKyBzcWwgKyBcIilcIlxuICAgICAgICByZXR1cm4gc3FsXG4gICAgfVxuXG5cblxuXG5cbiAgICBzZXRGaW5kT3B0aW9ucyhmaW5kT3B0aW9uczogRmluZE1hbnlPcHRpb25zPEVudGl0eT4pIHtcbiAgICAgICAgdGhpcy5maW5kT3B0aW9ucyA9IGZpbmRPcHRpb25zXG4gICAgICAgIHRoaXMuYXBwbHlGaW5kT3B0aW9ucygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN1YnF1ZXJ5IC0gcXVlcnkgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgb3RoZXIgcXVlcmllcy5cbiAgICAgKi9cbiAgICBzdWJRdWVyeSgpOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICBxYi5leHByZXNzaW9uTWFwLnN1YlF1ZXJ5ID0gdHJ1ZVxuICAgICAgICBxYi5wYXJlbnRRdWVyeUJ1aWxkZXIgPSB0aGlzXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KCk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KFxuICAgICAgICBzZWxlY3Rpb246IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBzZWxlY3Rpb25BbGlhc05hbWU/OiBzdHJpbmcsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZ1tdKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uPzpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5PiB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInNlbGVjdFwiXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gW1xuICAgICAgICAgICAgICAgIHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uOiAocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgc2VsZWN0aW9uIHRvIHRoZSBTRUxFQ1QgcXVlcnkuXG4gICAgICovXG4gICAgYWRkU2VsZWN0KHNlbGVjdGlvbjogc3RyaW5nW10pOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBzZWxlY3Rpb24gdG8gdGhlIFNFTEVDVCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRTZWxlY3QoXG4gICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiB0aGlzXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5jb25jYXQoXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBleGVjdXRpb24gdGltZS5cbiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgbWF4RXhlY3V0aW9uVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSA9IG1pbGxpc2Vjb25kc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIERJU1RJTkNULlxuICAgICAqL1xuICAgIGRpc3RpbmN0KGRpc3RpbmN0OiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3QgPSBkaXN0aW5jdFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRpc3RpbmN0IG9uIGNsYXVzZSBmb3IgUG9zdGdyZXMuXG4gICAgICovXG4gICAgZGlzdGluY3RPbihkaXN0aW5jdE9uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3RPbiA9IGRpc3RpbmN0T25cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDogKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEZST00gd2hpY2ggZW50aXR5J3MgdGFibGUgc2VsZWN0L3VwZGF0ZS9kZWxldGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBBbHNvIHNldHMgYSBtYWluIHN0cmluZyBhbGlhcyBvZiB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICogUmVtb3ZlcyBhbGwgcHJldmlvdXNseSBzZXQgZnJvbS1zLlxuICAgICAqL1xuICAgIGZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDpcbiAgICAgICAgICAgIHwgRW50aXR5VGFyZ2V0PFQ+XG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPiB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuY3JlYXRlRnJvbUFsaWFzKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKG1haW5BbGlhcylcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgYW55IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhc05hbWU6IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8VD5cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBhZGRGcm9tPFQgZXh0ZW5kcyBPYmplY3RMaXRlcmFsPihcbiAgICAgICAgZW50aXR5VGFyZ2V0OlxuICAgICAgICAgICAgfCBFbnRpdHlUYXJnZXQ8VD5cbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+IHtcbiAgICAgICAgY29uc3QgYWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSlcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNldE1haW5BbGlhcyhhbGlhcylcblxuICAgICAgICByZXR1cm4gdGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIGVudGl0eSdzIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJJTk5FUlwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgdGFibGUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luKFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5IGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmlubmVySm9pbihlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZW50aXR5J3MgcHJvcGVydHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmxlZnRKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHByb3BlcnR5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJMRUZUXCIsXG4gICAgICAgICAgICBlbnRpdHlPclByb3BlcnR5LFxuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgbWFwVG9Qcm9wZXJ0eSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGdpdmVuIHN1YnF1ZXJ5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpXG4gICAgICAgIHRoaXMuam9pbihcbiAgICAgICAgICAgIFwiTEVGVFwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuXG5cbiAgICAvKipcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IHsgZGlzYWJsZU1peGVkTWFwPzogYm9vbGVhbiB9LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXNOYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgeyBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuIH0sXG4gICAgICAgIHF1ZXJ5QnVpbGRlckZhY3Rvcnk/OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uSWRBdHRyaWJ1dGUgPSBuZXcgUmVsYXRpb25JZEF0dHJpYnV0ZSh0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgaWYgKHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZWxhdGlvbklkQXR0cmlidXRlLmFsaWFzID0gYWxpYXNOYW1lT3JPcHRpb25zXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIChhbGlhc05hbWVPck9wdGlvbnMgYXMgYW55KS5kaXNhYmxlTWl4ZWRNYXBcbiAgICAgICAgKVxuICAgICAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5kaXNhYmxlTWl4ZWRNYXAgPSB0cnVlXG5cbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gcXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25JZEF0dHJpYnV0ZXMucHVzaChyZWxhdGlvbklkQXR0cmlidXRlKVxuXG4gICAgICAgIGlmIChyZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uSWRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvdW50cyBudW1iZXIgb2YgZW50aXRpZXMgb2YgZW50aXR5J3MgcmVsYXRpb24gYW5kIG1hcHMgdGhlIHZhbHVlIGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbG9hZFJlbGF0aW9uQ291bnRBbmRNYXAoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzTmFtZT86IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeT86IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLFxuICAgICAgICApXG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5hbGlhcyA9IGFsaWFzTmFtZVxuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnF1ZXJ5QnVpbGRlckZhY3RvcnkgPSBxdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcy5wdXNoKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUpXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5qdW5jdGlvbkFsaWFzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOlxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHJlbGF0aW9uIGlkcyBmb3IgYWxsIHJlbGF0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgZW50aXR5LlxuICAgICAqIEFsbCByZWxhdGlvbiBpZHMgd2lsbCBiZSBtYXBwZWQgdG8gcmVsYXRpb24gcHJvcGVydHkgdGhlbXNlbGYuXG4gICAgICogSWYgYXJyYXkgb2Ygc3RyaW5ncyBpcyBnaXZlbiB0aGVuIGxvYWRzIG9ubHkgcmVsYXRpb24gaWRzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGxvYWRBbGxSZWxhdGlvbklkcyhvcHRpb25zPzoge1xuICAgICAgICByZWxhdGlvbnM/OiBzdHJpbmdbXVxuICAgICAgICBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuXG4gICAgfSk6IHRoaXMge1xuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLnJlbGF0aW9ucy5mb3JFYWNoKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVsYXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zLnJlbGF0aW9ucy5pbmRleE9mKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkgPT09IC0xXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgICAgIHRoaXMubG9hZFJlbGF0aW9uSWRBbmRNYXAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSArXG4gICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBXSEVSRSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgV0hFUkUgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgd2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBCcmFja2V0c1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXSAvLyBkb24ndCBtb3ZlIHRoaXMgYmxvY2sgYmVsb3cgc2luY2UgY29tcHV0ZVdoZXJlUGFyYW1ldGVyIGNhbiBhZGQgd2hlcmUgZXhwcmVzc2lvbnNcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSlcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9LFxuICAgICAgICAgICAgXVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kV2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgQnJhY2tldHNcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImFuZFwiLFxuICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgb3JXaGVyZShcbiAgICAgICAgd2hlcmU6XG4gICAgICAgICAgICB8IEJyYWNrZXRzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiB0aGlzKSA9PiBzdHJpbmcpXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxcbiAgICAgICAgICAgIHwgT2JqZWN0TGl0ZXJhbFtdLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3JcIixcbiAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSksXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIHdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIGFuZFdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmRXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICpcbiAgICAgKiBJZHMgYXJlIG1peGVkLlxuICAgICAqIEl0IG1lYW5zIGlmIHlvdSBoYXZlIHNpbmdsZSBwcmltYXJ5IGtleSB5b3UgY2FuIHBhc3MgYSBzaW1wbGUgaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSBbMSwgMiwgM10uXG4gICAgICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIHlvdSBuZWVkIHRvIHBhc3Mgb2JqZWN0IHdpdGggcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBzcGVjaWZpZWQsXG4gICAgICogZm9yIGV4YW1wbGUgW3sgZmlyc3RJZDogMSwgc2Vjb25kSWQ6IDIgfSwgeyBmaXJzdElkOiAyLCBzZWNvbmRJZDogMyB9LCAuLi5dXG4gICAgICovXG4gICAgb3JXaGVyZUluSWRzKGlkczogYW55IHwgYW55W10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEhBVklORyBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgSEFWSU5HIGNvbmRpdGlvbnMuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIGhhdmluZyhoYXZpbmc6IHN0cmluZywgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3MucHVzaCh7IHR5cGU6IFwic2ltcGxlXCIsIGNvbmRpdGlvbjogaGF2aW5nIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgSEFWSU5HIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kSGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiBoYXZpbmcgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIG9ySGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IGhhdmluZyB9KVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeTogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzID0gW2dyb3VwQnldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgYWRkR3JvdXBCeShncm91cEJ5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLnB1c2goZ3JvdXBCeSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIG9yZGVyIGJ5IHdpdGhvdXQgb3JkZXIgc2V0IHdpbGwgcmVtb3ZlIGFsbCBwcmV2aW91c2x5IHNldCBvcmRlciBieXMuXG4gICAgICovXG4gICAgb3JkZXJCeSgpOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShcbiAgICAgICAgc29ydDogc3RyaW5nLFxuICAgICAgICBvcmRlcj86IFwiQVNDXCIgfCBcIkRFU0NcIixcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIixcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShvcmRlcjogT3JkZXJCeUNvbmRpdGlvbik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIFNldHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBPUkRFUiBCWSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgT1JERVIgQlkgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBvcmRlckJ5KFxuICAgICAgICBzb3J0Pzogc3RyaW5nIHwgT3JkZXJCeUNvbmRpdGlvbixcbiAgICAgICAgb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIiA9IFwiQVNDXCIsXG4gICAgICAgIG51bGxzPzogXCJOVUxMUyBGSVJTVFwiIHwgXCJOVUxMUyBMQVNUXCIsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFwib3JkZXJcIiBjYW4gYWNjZXB0IG9ubHkgXCJBU0NcIiBhbmQgXCJERVNDXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIExBU1RcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm51bGxzXCIgY2FuIGFjY2VwdCBvbmx5IFwiTlVMTFMgRklSU1RcIiBhbmQgXCJOVUxMUyBMQVNUXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc29ydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHNvcnQgYXMgT3JkZXJCeUNvbmRpdGlvblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnQgYXMgc3RyaW5nXTogeyBvcmRlciwgbnVsbHMgfSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHsgW3NvcnQgYXMgc3RyaW5nXTogb3JkZXIgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKi9cbiAgICBhZGRPcmRlckJ5KFxuICAgICAgICBzb3J0OiBzdHJpbmcsXG4gICAgICAgIG9yZGVyOiBcIkFTQ1wiIHwgXCJERVNDXCIgPSBcIkFTQ1wiLFxuICAgICAgICBudWxscz86IFwiTlVMTFMgRklSU1RcIiB8IFwiTlVMTFMgTEFTVFwiLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAob3JkZXIgIT09IHVuZGVmaW5lZCAmJiBvcmRlciAhPT0gXCJBU0NcIiAmJiBvcmRlciAhPT0gXCJERVNDXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm9yZGVyXCIgY2FuIGFjY2VwdCBvbmx5IFwiQVNDXCIgYW5kIFwiREVTQ1wiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBGSVJTVFwiICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU2VsZWN0UXVlcnlCdWlsZGVyLmFkZE9yZGVyQnkgXCJudWxsc1wiIGNhbiBhY2NlcHQgb25seSBcIk5VTExTIEZJUlNUXCIgYW5kIFwiTlVMTFMgTEFTVFwiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIGlmIChudWxscykge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0geyBvcmRlciwgbnVsbHMgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0gb3JkZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCdzIExJTUlUIC0gbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHRha2UgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgbGltaXQobGltaXQ/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIobGltaXQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAubGltaXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwibGltaXRcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0J3MgT0ZGU0VUIC0gc2VsZWN0aW9uIG9mZnNldC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHNraXAgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgb2Zmc2V0KG9mZnNldD86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIob2Zmc2V0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwib2Zmc2V0XCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbWF4aW1hbCBudW1iZXIgb2YgZW50aXRpZXMgdG8gdGFrZS5cbiAgICAgKi9cbiAgICB0YWtlKHRha2U/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnRha2UgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcih0YWtlKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudGFrZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAudGFrZSlcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgXCJ0YWtlXCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHNraXAuXG4gICAgICovXG4gICAgc2tpcChza2lwPzogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5za2lwID0gdGhpcy5ub3JtYWxpemVOdW1iZXIoc2tpcClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNraXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgaXNOYU4odGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwic2tpcFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY2VydGFpbiBpbmRleCB0byBiZSB1c2VkIGJ5IHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBOYW1lIG9mIGluZGV4IHRvIGJlIHVzZWQuXG4gICAgICovXG4gICAgdXNlSW5kZXgoaW5kZXg6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlSW5kZXggPSBpbmRleFxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhsb2NrTW9kZTogXCJvcHRpbWlzdGljXCIsIGxvY2tWZXJzaW9uOiBudW1iZXIgfCBEYXRlKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogdW5kZWZpbmVkLFxuICAgICAgICBsb2NrVGFibGVzPzogc3RyaW5nW10sXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwib3B0aW1pc3RpY1wiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogbnVtYmVyIHwgRGF0ZSxcbiAgICAgICAgbG9ja1RhYmxlcz86IHN0cmluZ1tdLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPSBsb2NrTW9kZVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gPSBsb2NrVmVyc2lvblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcyA9IGxvY2tUYWJsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2sgaGFuZGxpbmcgYnkgYWRkaW5nIE5PIFdBSVQgb3IgU0tJUCBMT0NLRUQuXG4gICAgICovXG4gICAgc2V0T25Mb2NrZWQob25Mb2NrZWQ6IFwibm93YWl0XCIgfCBcInNraXBfbG9ja2VkXCIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID0gb25Mb2NrZWRcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgZ2xvYmFsIGNvbmRpdGlvbiBvZiBcIm5vbi1kZWxldGVkXCIgZm9yIHRoZSBlbnRpdHkgd2l0aCBkZWxldGUgZGF0ZSBjb2x1bW5zLlxuICAgICAqL1xuICAgIHdpdGhEZWxldGVkKCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2l0aERlbGV0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaXJzdCByYXcgcmVzdWx0IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3T25lPFQgPSBhbnk+KCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0UmF3TWFueSgpKVswXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHJhdyByZXN1bHRzIHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3TWFueTxUID0gYW55PigpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpIHtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIG9iamVjdCB3aXRoIHJhdyByZXN1bHRzIGFuZCBlbnRpdGllcyBjcmVhdGVkIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRSYXdBbmRFbnRpdGllczxUID0gYW55PigpOiBQcm9taXNlPHtcbiAgICAgICAgZW50aXRpZXM6IEVudGl0eVtdXG4gICAgICAgIHJhdzogVFtdXG4gICAgfT4ge1xuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUVudGl0aWVzQW5kUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBzaW5nbGUgZW50aXR5IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0T25lKCk6IFByb21pc2U8RW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRSYXdBbmRFbnRpdGllcygpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHMuZW50aXRpZXNbMF0gYXMgYW55XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4hLmdldEVudGl0eVZhbHVlKHJlc3VsdCkgLy8gd2hhdCBpZiBjb2x1bW5zIGFyZW50IHNldD9cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFZlcnNpb24uZ2V0VGltZSgpICE9PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24uZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS52ZXJzaW9uQ29sdW1uIS5nZXRFbnRpdHlWYWx1ZShyZXN1bHQpIC8vIHdoYXQgaWYgY29sdW1ucyBhcmVudCBzZXQ/XG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbFZlcnNpb24gIT09IHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbnRpdHkgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbCBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE9uZU9yRmFpbCgpOiBQcm9taXNlPEVudGl0eT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBhd2FpdCB0aGlzLmdldE9uZSgpXG5cbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLnRhcmdldCxcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudGl0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXRpZXMgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNYW55KCk6IFByb21pc2U8RW50aXR5W10+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0UmF3QW5kRW50aXRpZXMoKVxuICAgICAgICByZXR1cm4gcmVzdWx0cy5lbnRpdGllc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY291bnQgLSBudW1iZXIgb2YgZW50aXRpZXMgc2VsZWN0ZWQgYnkgc3FsIGdlbmVyYXRlZCBieSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQ291bnQgZXhjbHVkZXMgYWxsIGxpbWl0YXRpb25zIHNldCBieSBzZXRGaXJzdFJlc3VsdCBhbmQgc2V0TWF4UmVzdWx0cyBtZXRob2RzIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q291bnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKClcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXM6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKVxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeUVudGl0eSA9IGZhbHNlXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGVudGl0aWVzIGFuZCBvdmVyYWxsIGVudGl0aWVzIGNvdW50ICh3aXRob3V0IGxpbWl0YXRpb24pLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBidWlsZCBwYWdpbmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE1hbnlBbmRDb3VudCgpOiBQcm9taXNlPFtFbnRpdHlbXSwgbnVtYmVyXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgZW50aXRpZXNBbmRSYXcgPSBhd2FpdCB0aGlzLmV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICAgICAgY29uc3QgY2FjaGVJZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkXG5cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBjYWNoZUlkID8gYCR7Y2FjaGVJZH0tY291bnRgIDogY2FjaGVJZFxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogW0VudGl0eVtdLCBudW1iZXJdID0gW2VudGl0aWVzQW5kUmF3LmVudGl0aWVzLCBjb3VudF1cblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gIFxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZy5cbiAgICAgKi9cbiAgICBjYWNoZShlbmFibGVkOiBib29sZWFuKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBpbiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggY2FjaGUgd2lsbCBleHBpcmUuXG4gICAgICogSWYgbm90IHNldCB0aGVuIGdsb2JhbCBjYWNoaW5nIHRpbWUgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNhY2hlKG1pbGxpc2Vjb25kczogbnVtYmVyKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBjYWNoZSBpZCBhbmQgbWlsbGlzZWNvbmRzIGluIHdoaWNoIGNhY2hlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGNhY2hlKGlkOiBhbnksIG1pbGxpc2Vjb25kcz86IG51bWJlcik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcmVzdWx0IGNhY2hpbmcuXG4gICAgICovXG4gICAgY2FjaGUoXG4gICAgICAgIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcsXG4gICAgICAgIG1heWJlTWlsbGlzZWNvbmRzPzogbnVtYmVyLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gZW5hYmxlZE9yTWlsbGlzZWNvbmRzT3JJZFxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkID09PSBcIm51bWJlclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF5YmVNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gbWF5YmVNaWxsaXNlY29uZHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBxdWVyeSBidWlsZGVyIHdvcmtzLlxuICAgICAqL1xuICAgIHNldE9wdGlvbihvcHRpb246IFNlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvbik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG5cblxuICAgIHByb3RlY3RlZCBqb2luKFxuICAgICAgICBkaXJlY3Rpb246IFwiSU5ORVJcIiB8IFwiTEVGVFwiLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgICAgIG1hcFRvUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIGlzTWFwcGluZ01hbnk/OiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyB8fCB7fSlcblxuICAgICAgICBjb25zdCBqb2luQXR0cmlidXRlID0gbmV3IEpvaW5BdHRyaWJ1dGUoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgIClcbiAgICAgICAgam9pbkF0dHJpYnV0ZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICAgICAgam9pbkF0dHJpYnV0ZS5tYXBUb1Byb3BlcnR5ID0gbWFwVG9Qcm9wZXJ0eVxuICAgICAgICBqb2luQXR0cmlidXRlLmlzTWFwcGluZ01hbnkgPSBpc01hcHBpbmdNYW55XG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuZW50aXR5T3JQcm9wZXJ0eSA9IGVudGl0eU9yUHJvcGVydHkgLy8gcmVsYXRpb25OYW1lXG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uID0gY29uZGl0aW9uID8gY29uZGl0aW9uIDogdW5kZWZpbmVkIC8vIGpvaW5JbnZlcnNlU2lkZUNvbmRpdGlvblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5wdXNoKGpvaW5BdHRyaWJ1dGUpXG5cbiAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25EZWxldGVDb2x1bW4gPSBgJHthbGlhc05hbWV9LiR7am9pbkF0dHJpYnV0ZS5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZX0gSVMgTlVMTGBcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiA9IGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gYCAke2pvaW5BdHRyaWJ1dGUuY29uZGl0aW9ufSBBTkQgJHtjb25kaXRpb25EZWxldGVDb2x1bW59YFxuICAgICAgICAgICAgICAgICAgICA6IGAke2NvbmRpdGlvbkRlbGV0ZUNvbHVtbn1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUuYWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuY3JlYXRlQWxpYXMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiam9pblwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogam9pbkF0dHJpYnV0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgam9pbkF0dHJpYnV0ZS5yZWxhdGlvbiAmJlxuICAgICAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqb2luXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5BdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN1YlF1ZXJ5OiBzdHJpbmcgPSBcIlwiXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGl0eU9yUHJvcGVydHkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5QnVpbGRlcjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4gPSAoXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkgYXMgYW55XG4gICAgICAgICAgICAgICAgKSgodGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLnN1YlF1ZXJ5KCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICAgICAgc3ViUXVlcnkgPSBzdWJRdWVyeUJ1aWxkZXIuZ2V0UXVlcnkoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJRdWVyeSA9IGVudGl0eU9yUHJvcGVydHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbnRpdHlPclByb3BlcnR5ID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAoZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgMSkgPT09IFwiKFwiICYmXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkuc3Vic3RyKC0xKSA9PT0gXCIpXCIpXG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoOlxuICAgICAgICAgICAgICAgICAgICBpc1N1YlF1ZXJ5ID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoZW50aXR5T3JQcm9wZXJ0eSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdWJRdWVyeTogaXNTdWJRdWVyeSA9PT0gdHJ1ZSA/IHN1YlF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJTRUxFQ1QgRlJPTVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3RFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2Fubm90IGJ1aWxkIHF1ZXJ5IGJlY2F1c2UgbWFpbiBhbGlhcyBpcyBub3Qgc2V0IChjYWxsIHFiI2Zyb20gbWV0aG9kKVwiLFxuICAgICAgICAgICAgKVxuXG5cblxuICAgICAgICBjb25zdCBhbGxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cbiAgICAgICAgY29uc3QgZXhjbHVkZWRTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBhbGxTZWxlY3RzLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoam9pbi5tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkU2VsZWN0cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNNYWluQWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBqb2luLmFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5lc2NhcGUoam9pbi5hbGlhcy5uYW1lISkgKyBcIi4qXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkU2VsZWN0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+IHNlbGVjdC5zZWxlY3Rpb24gPT09IGpvaW4uYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChleGNsdWRlZFNlbGVjdCEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKHNlbGVjdCkgPT4gZXhjbHVkZWRTZWxlY3RzLmluZGV4T2Yoc2VsZWN0KSA9PT0gLTEpXG4gICAgICAgICAgICAuZm9yRWFjaCgoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhzZWxlY3Quc2VsZWN0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3QuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuXG5cbiAgICAgICAgaWYgKGFsbFNlbGVjdHMubGVuZ3RoID09PSAwKSBhbGxTZWxlY3RzLnB1c2goeyBzZWxlY3Rpb246IFwiKlwiIH0pXG5cblxuICAgICAgICBsZXQgdXNlSW5kZXg6IHN0cmluZyA9IFwiXCJcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCkge1xuICAgICAgICAgICAgaWYgKERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICB1c2VJbmRleCA9IGAgVVNFIElOREVYICgke3RoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleH0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBmcm9tcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc2VzXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChhbGlhcykgPT5cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMudHlwZSA9PT0gXCJmcm9tXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFsaWFzLnRhYmxlUGF0aCB8fCBhbGlhcy5zdWJRdWVyeSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChhbGlhcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGlhcy5zdWJRdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLnN1YlF1ZXJ5ICsgXCIgXCIgKyB0aGlzLmVzY2FwZShhbGlhcy5uYW1lKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoYWxpYXMudGFibGVQYXRoISkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGFsaWFzLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzZWxlY3QgPSB0aGlzLmNyZWF0ZVNlbGVjdERpc3RpbmN0RXhwcmVzc2lvbigpXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGFsbFNlbGVjdHNcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QuYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiIEFTIFwiICsgdGhpcy5lc2NhcGUoc2VsZWN0LmFsaWFzTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlbGVjdCArXG4gICAgICAgICAgICBzZWxlY3Rpb24gK1xuICAgICAgICAgICAgXCIgRlJPTSBcIiArXG4gICAgICAgICAgICBmcm9tcy5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUYWJsZUxvY2tFeHByZXNzaW9uKCkgK1xuICAgICAgICAgICAgdXNlSW5kZXhcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc2VsZWN0IHwgc2VsZWN0IGRpc3RpbmN0IHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3REaXN0aW5jdEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBzZWxlY3REaXN0aW5jdCwgc2VsZWN0RGlzdGluY3RPbiwgbWF4RXhlY3V0aW9uVGltZSB9ID1cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcFxuICAgICAgICBjb25zdCB7IGRyaXZlciB9ID0gdGhpcy5jb25uZWN0aW9uXG5cbiAgICAgICAgbGV0IHNlbGVjdCA9IFwiU0VMRUNUIFwiXG5cbiAgICAgICAgaWYgKG1heEV4ZWN1dGlvblRpbWUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ICs9IGAvKisgTUFYX0VYRUNVVElPTl9USU1FKCR7dGhpcy5leHByZXNzaW9uTWFwLm1heEV4ZWN1dGlvblRpbWV9KSAqLyBgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgJiZcbiAgICAgICAgICAgIHNlbGVjdERpc3RpbmN0T24ubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdERpc3RpbmN0T25NYXAgPSBzZWxlY3REaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgLm1hcCgob24pID0+IHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMob24pKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgICAgICAgc2VsZWN0ID0gYFNFTEVDVCBESVNUSU5DVCBPTiAoJHtzZWxlY3REaXN0aW5jdE9uTWFwfSkgYFxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdERpc3RpbmN0KSB7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBcIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJKT0lOXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUpvaW5FeHByZXNzaW9uKCk6IHN0cmluZyB7XG5cblxuXG5cblxuXG5cblxuICAgICAgICBjb25zdCBqb2lucyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5tYXAoKGpvaW5BdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IGpvaW5BdHRyLnJlbGF0aW9uXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblRhYmxlTmFtZSA9IGpvaW5BdHRyLnRhYmxlUGF0aFxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25UYWJsZUFsaWFzID0gam9pbkF0dHIuYWxpYXMubmFtZVxuICAgICAgICAgICAgbGV0IGFwcGVuZGVkQ29uZGl0aW9uID0gam9pbkF0dHIuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgPyBcIiBBTkQgKFwiICsgam9pbkF0dHIuY29uZGl0aW9uICsgXCIpXCJcbiAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEFsaWFzID0gam9pbkF0dHIucGFyZW50QWxpYXNcblxuXG5cbiAgICAgICAgICAgIGlmICghcGFyZW50QWxpYXMgfHwgIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Kb2luID0gam9pbkF0dHIuYWxpYXMuc3ViUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgPyBqb2luQXR0ci5hbGlhcy5zdWJRdWVyeVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uSm9pbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgKGpvaW5BdHRyLmNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIiBPTiBcIiArIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoam9pbkF0dHIuY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNNYW55VG9PbmUgfHwgcmVsYXRpb24uaXNPbmVUb09uZU93bmVyKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lcikge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uID0gcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRpdHktY2hpbGRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZENvbmRpdGlvbiArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBBTkQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2NyaW1pbmF0b3JDb2x1bW4uZGF0YWJhc2VOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzY3JpbWluYXRvclZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgY29uc3QganVuY3Rpb25UYWJsZU5hbWUgPVxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhIS50YWJsZVBhdGhcblxuICAgICAgICAgICAgICAgIGNvbnN0IGp1bmN0aW9uQWxpYXMgPSBqb2luQXR0ci5qdW5jdGlvbkFsaWFzXG4gICAgICAgICAgICAgICAgbGV0IGp1bmN0aW9uQ29uZGl0aW9uID0gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSBcIlwiXG5cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAganVuY3Rpb25Db25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoam9pbkNvbHVtbikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuY3Rpb25BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGpvaW5Db2x1bW4pID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbmRpdGlvbiA9IHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW52ZXJzZVJlbGF0aW9uIS5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICBqb2luQXR0ci5kaXJlY3Rpb24gK1xuICAgICAgICAgICAgICAgICAgICBcIiBKT0lOIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoanVuY3Rpb25UYWJsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShqdW5jdGlvbkFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGp1bmN0aW9uQ29uZGl0aW9uKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gam9pbnMuam9pbihcIiBcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiR1JPVVAgQllcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFwiIEdST1VQIEJZIFwiICtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXModGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLmpvaW4oXCIsIFwiKSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcmRlckJ5RXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxsT3JkZXJCeXNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yZGVyQnlzKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBcIiBPUkRFUiBCWSBcIiArXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JkZXJCeXNbY29sdW1uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGNvbHVtbk5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckJ5c1tjb2x1bW5OYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZGVyQnlzW2NvbHVtbk5hbWVdIGFzIGFueSkub3JkZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmRlckJ5c1tjb2x1bW5OYW1lXSBhcyBhbnkpLm51bGxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTElNSVRcIiBhbmQgXCJPRkZTRVRcIiBwYXJ0cyBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxpbWl0T2Zmc2V0RXhwcmVzc2lvbigpOiBzdHJpbmcge1xuXG5cbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdGhpcy5leHByZXNzaW9uTWFwLm9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB0aGlzLmV4cHJlc3Npb25NYXAubGltaXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW9mZnNldCAmJlxuICAgICAgICAgICAgIWxpbWl0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNraXBcbiAgICAgICAgICAgIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLnRha2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgbGV0IHByZWZpeCA9IFwiXCJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobGltaXQgfHwgb2Zmc2V0KSAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZXhwcmVzc2lvbk1hcC5hbGxPcmRlckJ5cykubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiIE9SREVSIEJZIChTRUxFQ1QgTlVMTClcIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9GRlNFVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArXG4gICAgICAgICAgICAgICAgICAgIFwiIFJPV1MgRkVUQ0ggTkVYVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBPTkxZXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgXCIgT0ZGU0VUIDAgUk9XUyBGRVRDSCBORVhUIFwiICsgbGltaXQgKyBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHJldHVybiBwcmVmaXggKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTXCJcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikgfHxcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiIHx8XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJzYXBcIiB8fFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGxpbWl0ICYmIG9mZnNldCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXRcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXRcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHRocm93IG5ldyBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpXG4gICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNTUUxpdGVGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0ICsgXCIgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgICAgICBpZiAobGltaXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0XG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgLTEgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgT0ZGU0VUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBGRVRDSCBORVhUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgbGltaXQgK1xuICAgICAgICAgICAgICAgICAgICBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIEZFVENIIE5FWFQgXCIgKyBsaW1pdCArIFwiIFJPV1MgT05MWVwiXG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgT0ZGU0VUIFwiICsgb2Zmc2V0ICsgXCIgUk9XU1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdCArIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICAgICAgaWYgKGxpbWl0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdFxuICAgICAgICAgICAgaWYgKG9mZnNldCkgcmV0dXJuIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTE9DS1wiIHBhcnQgb2YgU0VMRUNUIFF1ZXJ5IGFmdGVyIHRhYmxlIENsYXVzZVxuICAgICAqIGV4LlxuICAgICAqICBTRUxFQ1QgMVxuICAgICAqICBGUk9NIFVTRVIgVSBXSVRIIChOT0xPQ0spXG4gICAgICogIEpPSU4gT1JERVIgTyBXSVRIIChOT0xPQ0spXG4gICAgICogICAgICBPTiBVLklEPU8uT3JkZXJJRFxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXNzcWxcIikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoSE9MRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIFdJVEggKFVQRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlydHlfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoTk9MT0NLKVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJMT0NLXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxvY2tFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXJcblxuICAgICAgICBsZXQgbG9ja1RhYmxlc0NsYXVzZSA9IFwiXCJcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJMb2NrIHRhYmxlcyBub3Qgc3VwcG9ydGVkIGluIHNlbGVjdGVkIGRyaXZlclwiLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2tUYWJsZXMgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlID0gXCIgT0YgXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5qb2luKFwiLCBcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvbkxvY2tFeHByZXNzaW9uID0gXCJcIlxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID09PSBcIm5vd2FpdFwiKSB7XG4gICAgICAgICAgICBvbkxvY2tFeHByZXNzaW9uID0gXCIgTk9XQUlUXCJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cHJlc3Npb25NYXAub25Mb2NrZWQgPT09IFwic2tpcF9sb2NrZWRcIikge1xuICAgICAgICAgICAgb25Mb2NrRXhwcmVzc2lvbiA9IFwiIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3JlYWRcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXlzcWxcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUmVsZWFzZVZlcnNpb25PckdyZWF0ZXIoZHJpdmVyLCBcIjguMC4wXCIpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBGT1IgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgTE9DSyBJTiBTSEFSRSBNT0RFXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtYXJpYWRiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIExPQ0sgSU4gU0hBUkUgTU9ERVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBTSEFSRVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiYXVyb3JhLW15c3FsXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJvcmFjbGVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgb25Mb2NrRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcml2ZXIub3B0aW9ucy50eXBlID09PSBcIm1zc3FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCIgKyBsb2NrVGFibGVzQ2xhdXNlICsgXCIgU0tJUCBMT0NLRURcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBcIiBOT1dBSVRcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIE5PV0FJVFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmb3Jfbm9fa2V5X3VwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiY29ja3JvYWNoZGJcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgRk9SIE5PIEtFWSBVUERBVEVcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZm9yX2tleV9zaGFyZVwiOlxuICAgICAgICAgICAgICAgIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIEZPUiBLRVkgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkhBVklOR1wiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVIYXZpbmdFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3NcbiAgICAgICAgICAgIC5tYXAoKGhhdmluZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhdmluZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ID4gMCA/IFwiQU5EIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCA+IDAgPyBcIk9SIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGhhdmluZy5jb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKVxuXG4gICAgICAgIGlmICghY29uZGl0aW9ucy5sZW5ndGgpIHJldHVybiBcIlwiXG4gICAgICAgIHJldHVybiBcIiBIQVZJTkcgXCIgKyBjb25kaXRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkRXNjYXBlZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IGhhc01haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWUsXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdID0gW11cbiAgICAgICAgaWYgKGhhc01haW5BbGlhcykge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaXNTZWxlY3QgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5zLnB1c2goXG4gICAgICAgICAgICAuLi5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApXG5cblxuXG5cbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKVxuXG4gICAgICAgICAgICByZXR1cm4gW11cblxuICAgICAgICBjb25zdCBub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5XG4gICAgICAgICAgICA/IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PiBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUNvbHVtbikgPT09IC0xLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbLi4uY29sdW1ucywgLi4ubm9uU2VsZWN0ZWRQcmltYXJ5Q29sdW1uc11cbiAgICAgICAgY29uc3QgZmluYWxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBjb25zdCBlc2NhcGVkQWxpYXNOYW1lID0gdGhpcy5lc2NhcGUoYWxpYXNOYW1lKVxuICAgICAgICBhbGxDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvblBhdGggPVxuICAgICAgICAgICAgICAgIGVzY2FwZWRBbGlhc05hbWUgKyBcIi5cIiArIHRoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoZXNjYXBlZEFsaWFzTmFtZSl9KWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBzZWxlY3Rpb24udmlydHVhbCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5hbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogaGFzTWFpbkFsaWFzLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmaW5hbFNlbGVjdHNcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmluZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IG1haW5TZWxlY3QgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgKHNlbGVjdCkgPT4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lLFxuICAgICAgICApXG4gICAgICAgIGlmIChtYWluU2VsZWN0KSByZXR1cm4gW21haW5TZWxlY3RdXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbHRlcigoc2VsZWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuY29sdW1ucy5zb21lKFxuICAgICAgICAgICAgICAgIChjb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVDb3VudEV4cHJlc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgLy8gdG9kbzogd2lsbCB0aGlzIHdvcmsgd2l0aCBcImZyb21UYWJsZU5hbWVcIj9cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNcbiAgICAgICAgY29uc3QgZGlzdGluY3RBbGlhcyA9IHRoaXMuZXNjYXBlKG1haW5BbGlhcylcblxuXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBcIkNPVU5UKDEpXCJcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiIHx8XG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KHRoaXMuY29ubmVjdGlvbi5kcml2ZXIpXG4gICAgICAgICkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVChcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseSh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyKSkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVCBcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0V4cHJlc3Npb24gPSBwcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7ZGlzdGluY3RBbGlhc30uJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVChDT05DQVQoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKSlgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiKSB7XG5cblxuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICApfSkpYFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zRXhwcmVzc2lvbiA9IHByaW1hcnlDb2x1bW5zXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHByaW1hcnlDb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgQ0FTVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApfSBBUyBTVFJJTkcpYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcbiAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoQ09OQ0FUKCR7Y29sdW1uc0V4cHJlc3Npb259KSkpYFxuICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYENPVU5UKERJU1RJTkNUKGAgK1xuICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAubWFwKChjKSA9PiBgJHtkaXN0aW5jdEFsaWFzfS4ke3RoaXMuZXNjYXBlKGMuZGF0YWJhc2VOYW1lKX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiIHx8ICd8O3wnIHx8IFwiKSArXG4gICAgICAgICAgICBcIikpXCJcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICAgICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxuICAgICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IGNvdW50U3FsID0gdGhpcy5jb21wdXRlQ291bnRFeHByZXNzaW9uKClcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAub3JkZXJCeSgpXG4gICAgICAgICAgICAuZ3JvdXBCeSgpXG4gICAgICAgICAgICAub2Zmc2V0KHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5saW1pdCh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2tpcCh1bmRlZmluZWQpXG4gICAgICAgICAgICAudGFrZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2VsZWN0KGNvdW50U3FsLCBcImNudFwiKVxuICAgICAgICAgICAgLnNldE9wdGlvbihcImRpc2FibGUtZ2xvYmFsLW9yZGVyXCIpXG4gICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cbiAgICAgICAgaWYgKCFyZXN1bHRzIHx8ICFyZXN1bHRzWzBdIHx8ICFyZXN1bHRzWzBdW1wiY250XCJdKSByZXR1cm4gMFxuXG4gICAgICAgIHJldHVybiBwYXJzZUludChyZXN1bHRzWzBdW1wiY250XCJdKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcHBseUZpbmRPcHRpb25zKCkge1xuXG5cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uTG9hZFN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tZW50KHRoaXMuZmluZE9wdGlvbnMuY29tbWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMud2l0aERlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhEZWxldGVkKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnNlbGVjdClcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnNlbGVjdFxuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdHMgPSBbXVxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFJlbGF0aW9ucyhcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5maW5kT3B0aW9ucy5zZWxlY3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJqb2luXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5maW5kT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QgYXMgRmluZE9wdGlvbnNTZWxlY3Q8YW55PilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy53aGVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5kV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbnMuc3Vic3RyKDAsIDEpICE9PSBcIihcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIoXCIgKyB0aGlzLmNvbmRpdGlvbnMgKyBcIilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICApIC8vIHRlbXBvcmFyeSBhbmQgd2hlcmUgYW5kIGJyYWNlc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5vcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRPcmRlcihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5vcmRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmpvaW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuam9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoam9pbi5zZWxlY3QgJiYgIWpvaW4uc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2luLnR5cGUgPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtqb2luLnBhcmVudEFsaWFzfS4ke2pvaW4ucmVsYXRpb25NZXRhZGF0YS5wcm9wZXJ0eVBhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW4udHlwZSA9PT0gXCJpbm5lclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lckpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7am9pbi5wYXJlbnRBbGlhc30uJHtqb2luLnJlbGF0aW9uTWV0YWRhdGEucHJvcGVydHlQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2tpcCAhPT0gdW5kZWZpbmVkKSB7XG5cblxuXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwKHRoaXMuZmluZE9wdGlvbnMuc2tpcClcblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnRha2UgIT09IHVuZGVmaW5lZCkge1xuXG5cblxuICAgICAgICAgICAgICAgIHRoaXMudGFrZSh0aGlzLmZpbmRPcHRpb25zLnRha2UpXG5cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKHRoaXMuZmluZE9wdGlvbnMuY2FjaGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmZpbmRPcHRpb25zLmNhY2hlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUodGhpcy5maW5kT3B0aW9ucy5jYWNoZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLm1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW4pLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luIS5sZWZ0Sm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW5BbmRTZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luQW5kU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICApLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmxlZnRKb2luQW5kU2VsZWN0IVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luQW5kU2VsZWN0KVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuam9pbi5pbm5lckpvaW5BbmRTZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbkFuZFNlbGVjdCFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwib3B0aW1pc3RpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9jayhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY19yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJkaXJ0eV9yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGVzc2ltaXN0aWNfd3JpdGVfb3JfZmFpbFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlID09PSBcImZvcl9ub19rZXlfdXBkYXRlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZm9yX2tleV9zaGFyZVwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXMgPSB0aGlzLmZpbmRPcHRpb25zLmxvY2sudGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZmluZE9wdGlvbnMubG9jay50YWJsZXMubWFwKCh0YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVBbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmFsaWFzZXMuZmluZCgoYWxpYXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPT09IHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZUFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHt0YWJsZX1cIiBpcyBub3QgcGFydCBvZiB0aGlzIHF1ZXJ5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGUodGFibGVBbGlhcy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2NrKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVzLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMubG9jay5vbkxvY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPbkxvY2tlZCh0aGlzLmZpbmRPcHRpb25zLmxvY2sub25Mb2NrZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvYWRSZWxhdGlvbklkcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZEFsbFJlbGF0aW9uSWRzKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMubG9hZFJlbGF0aW9uSWRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQWxsUmVsYXRpb25JZHModGhpcy5maW5kT3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgYXMgYW55KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5qb2luRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMudHJhbnNhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSB0cnVlXG4gICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyBvYmplY3Qgd2l0aCByYXcgcmVzdWx0cyBhbmQgZW50aXRpZXMgY3JlYXRlZCBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcbiAgICApOiBQcm9taXNlPHsgZW50aXRpZXM6IEVudGl0eVtdOyByYXc6IGFueVtdIH0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgQWxpYXMgaXMgbm90IHNldC4gVXNlIFwiZnJvbVwiIG1ldGhvZCB0byBzZXQgYW4gYWxpYXMuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3JlYWRcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwiZm9yX25vX2tleV91cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJmb3Jfa2V5X3NoYXJlXCIpICYmXG4gICAgICAgICAgICAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZVxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yKClcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIikge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLnZlcnNpb25Db2x1bW4gJiYgIW1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhLm5hbWUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbklkTG9hZGVyID0gbmV3IFJlbGF0aW9uSWRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbkNvdW50TG9hZGVyID0gbmV3IFJlbGF0aW9uQ291bnRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbklkTWV0YWRhdGFUcmFuc2Zvcm1lciA9XG4gICAgICAgICAgICBuZXcgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lcih0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uQ291bnRNZXRhZGF0YVRyYW5zZm9ybWVyID1cbiAgICAgICAgICAgIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyKHRoaXMuZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIudHJhbnNmb3JtKClcblxuICAgICAgICBsZXQgcmF3UmVzdWx0czogYW55W10gPSBbXSxcbiAgICAgICAgICAgIGVudGl0aWVzOiBhbnlbXSA9IFtdXG5cblxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLnNraXAgfHwgdGhpcy5leHByZXNzaW9uTWFwLnRha2UpICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID4gMFxuICAgICAgICApIHtcblxuXG4gICAgICAgICAgICBjb25zdCBbc2VsZWN0cywgb3JkZXJCeXNdID1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9yZGVyQnlDb21iaW5lZFdpdGhTZWxlY3RFeHByZXNzaW9uKFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBjb25zdCBtYWluQWxpYXNOYW1lID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U2VsZWN0cyA9IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChcbiAgICAgICAgICAgICAgICAocHJpbWFyeUNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdEFsaWFzID0gdGhpcy5lc2NhcGUoXCJkaXN0aW5jdEFsaWFzXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkFsaWFzID0gdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckJ5c1tjb2x1bW5BbGlhc10pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQnlzW2NvbHVtbkFsaWFzXSA9IFwiQVNDXCJcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZGlzdGluY3RBbGlhc30uJHtjb2x1bW5BbGlhc30gQVMgJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcihcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnNlbGVjdChgRElTVElOQ1QgJHtxdWVyeVNlbGVjdHMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICAgICAgLmFkZFNlbGVjdChzZWxlY3RzKVxuICAgICAgICAgICAgICAgIC5mcm9tKGAoJHt0aGlzLmNsb25lKCkub3JkZXJCeSgpLmdldFF1ZXJ5KCl9KWAsIFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgICAgIC5vZmZzZXQodGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgICAgICAgICAgLmxpbWl0KHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlKVxuICAgICAgICAgICAgICAgIC5vcmRlckJ5KG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5jYWNoZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgIC5zZXROYXRpdmVQYXJhbWV0ZXJzKHRoaXMuZXhwcmVzc2lvbk1hcC5uYXRpdmVQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgIC5nZXRSYXdNYW55KClcblxuICAgICAgICAgICAgaWYgKHJhd1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBcIlwiXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyczogT2JqZWN0TGl0ZXJhbCA9IHt9XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmhhc011bHRpcGxlUHJpbWFyeUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcmF3UmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwcmltYXJ5Q29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbUtleSA9IGBvcm1fZGlzdGluY3RfaWRzXyR7aW5kZXh9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1twYXJhbUtleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGlkc18ke21haW5BbGlhc05hbWV9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttYWluQWxpYXNOYW1lfS4ke3ByaW1hcnlDb2x1bW4ucHJvcGVydHlQYXRofT06JHtwYXJhbUtleX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBPUiBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0uZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gcmF3UmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0W2FsaWFzXSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJlQWxsTnVtYmVycyA9IGlkcy5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpZDogYW55KSA9PiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZUFsbE51bWJlcnMpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gYCR7bWFpbkFsaWFzTmFtZX0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gSU4gKCR7aWRzLmpvaW4oXCIsIFwiKX0pYFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcIm9ybV9kaXN0aW5jdF9pZHNcIl0gPSBpZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgSU4gKDouLi5vcm1fZGlzdGluY3RfaWRzKVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyA9IGF3YWl0IHRoaXMuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAubWVyZ2VFeHByZXNzaW9uTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgdGhpcy5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdSZXN1bHRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgY29uc3QgcmF3UmVsYXRpb25JZFJlc3VsdHMgPSBhd2FpdCByZWxhdGlvbklkTG9hZGVyLmxvYWQocmF3UmVzdWx0cylcbiAgICAgICAgICAgIGNvbnN0IHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzID0gYXdhaXQgcmVsYXRpb25Db3VudExvYWRlci5sb2FkKFxuICAgICAgICAgICAgICAgIHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lcihcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbklkUmVzdWx0cyxcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbkNvdW50UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZW50aXRpZXMgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzISxcbiAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXG4gICAgICAgICAgICAgICAgICAgIFwiTG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcInF1ZXJ5XCIpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25NZXRhZGF0YXMubWFwKGFzeW5jIChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvblRhcmdldCA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5zZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChyZWxhdGlvbkFsaWFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20ocmVsYXRpb25UYXJnZXQsIHJlbGF0aW9uQWxpYXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmluZE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmZpbmRPcHRpb25zLm9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoRGVsZXRlZDogdGhpcy5maW5kT3B0aW9ucy53aXRoRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkxvYWRTdHJhdGVneTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5R3JvdXBzOiBhbnlbXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlbGF0aW9uSWRMb2FkZXIubG9hZE1hbnlUb01hbnlSZWxhdGlvbklkc0FuZEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlCdWlsZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlHcm91cCA9IHJlbGF0ZWRFbnRpdHlHcm91cHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3VwKSA9PiBncm91cC5lbnRpdHkgPT09IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXc6IHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICBlbnRpdGllczogZW50aXRpZXMsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3JkZXJCeUNvbWJpbmVkV2l0aFNlbGVjdEV4cHJlc3Npb24oXG4gICAgICAgIHBhcmVudEFsaWFzOiBzdHJpbmcsXG4gICAgKTogW3N0cmluZywgT3JkZXJCeUNvbmRpdGlvbl0ge1xuXG4gICAgICAgIGNvbnN0IG9yZGVyQnlzID0gdGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzXG4gICAgICAgIGNvbnN0IHNlbGVjdFN0cmluZyA9IE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgLm1hcCgob3JkZXJDcml0ZXJpYSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcmRlckNyaXRlcmlhLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxpYXNOYW1lID0gY3JpdGVyaWFQYXJ0c1swXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5tZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4hLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PSBvcmRlckNyaXRlcmlhIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIG9yZGVyQ3JpdGVyaWFcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgY29uc3Qgb3JkZXJCeU9iamVjdDogT3JkZXJCeUNvbmRpdGlvbiA9IHt9XG4gICAgICAgIE9iamVjdC5rZXlzKG9yZGVyQnlzKS5mb3JFYWNoKChvcmRlckNyaXRlcmlhKSA9PiB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gY3JpdGVyaWFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMubWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIG9yZGVyQnlPYmplY3RbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiEuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSA9IG9yZGVyQnlzW29yZGVyQ3JpdGVyaWFdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gb3JkZXJDcml0ZXJpYSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJCeU9iamVjdFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArIFwiLlwiICsgb3JkZXJDcml0ZXJpYVxuICAgICAgICAgICAgICAgICAgICBdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W29yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtzZWxlY3RTdHJpbmcsIG9yZGVyQnlPYmplY3RdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcmF3IHJlc3VsdHMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGxvYWRSYXdSZXN1bHRzKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcikge1xuICAgICAgICBjb25zdCBbc3FsLCBwYXJhbWV0ZXJzXSA9IHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKClcbiAgICAgICAgY29uc3QgcXVlcnlJZCA9IHNxbCArIFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycylcbiAgICAgICAgY29uc3QgY2FjaGVPcHRpb25zID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgID8gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGVcbiAgICAgICAgICAgICAgICA6IHt9XG4gICAgICAgIGxldCBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zOiBRdWVyeVJlc3VsdENhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgbGV0IGNhY2hlRXJyb3IgPSBmYWxzZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5nZXRGcm9tQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlT3B0aW9ucy5kdXJhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5pc0V4cGlyZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMucmVzdWx0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZU9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhY2hlRXJyb3IgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0cnVlKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFjYWNoZUVycm9yICYmXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLnN0b3JlSW5DYWNoZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZU9wdGlvbnMuZHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHRzLnJlY29yZHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVPcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLnJlY29yZHNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgaW50byBleHByZXNzaW9uIG1hcCBnaXZlbiBleHByZXNzaW9uIG1hcCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtZXJnZUV4cHJlc3Npb25NYXAoXG4gICAgICAgIGV4cHJlc3Npb25NYXA6IFBhcnRpYWw8UXVlcnlFeHByZXNzaW9uTWFwPixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMuZXhwcmVzc2lvbk1hcCwgZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgZ2l2ZSBudW1iZXIgLSBjb252ZXJ0cyB0byBpbnQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG5vcm1hbGl6ZU51bWJlcihudW06IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIiB8fCBudW0gPT09IHVuZGVmaW5lZCB8fCBudW0gPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVtXG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihudW0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgdXNlZCB0byBleGVjdXRlIHNxbCBxdWVyaWVzIGluc2lkZSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9idGFpblF1ZXJ5UnVubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoXCJzbGF2ZVwiKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFNlbGVjdChcbiAgICAgICAgc2VsZWN0OiBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGVtYmVkUHJlZml4Pzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc2VsZWN0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0W2tleV0gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rba2V5XSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aFN0cmljdChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCBlbWJlZCA9IG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpb24gPSBtZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aClcblxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhY29sdW1uICYmICFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKHByb3BlcnR5UGF0aCwgbWV0YWRhdGEpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdHMucHVzaChhbGlhcyArIFwiLlwiICsgcHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rba2V5XSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShzZWxlY3Rpb24sIGVtYmVkLnByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpvaW5BbGlhcyA9IGFsaWFzICsgXCJfXCIgKyBwcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgam9pbkFsaWFzID0gRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgeyBqb2luZXI6IFwiX19cIiB9LFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJxdWVyeVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uTWV0YWRhdGFzLnB1c2gocmVsYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb25bcmVsYXRpb25OYW1lXSA9PT0gXCJvYmplY3RcIiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWxlY3Rpb25bXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRBbGlhczogYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbltyZWxhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkU2VsZWN0KCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcImpvaW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKHNlbGVjdGlvbiwgZW1iZWQucHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID0gYWxpYXMgKyBcIl9cIiArIHByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICBqb2luQWxpYXMgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZWxhdGlvblZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVhZ2VyUmVsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbi5wcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0Sm9pbiA9IHRoaXMuam9pbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGVhZ2VyUmVsYXRpb25Kb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogZWFnZXJSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uW3JlbGF0aW9uTmFtZV0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkT3JkZXIoXG4gICAgICAgIG9yZGVyOiBGaW5kT3B0aW9uc09yZGVyPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvcmRlcikge1xuICAgICAgICAgICAgaWYgKG9yZGVyW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gZW1iZWRQcmVmaXggPyBlbWJlZFByZWZpeCArIFwiLlwiICsga2V5IDoga2V5XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlQcm9wZXJ0eU5vdEZvdW5kRXJyb3IocHJvcGVydHlQYXRoLCBtZXRhZGF0YSlcblxuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3JkZXJba2V5XSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAob3JkZXJba2V5XSBhcyBhbnkpLmRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvcmRlcltrZXldXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBcIkRFU0NcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IFwiZGVzY1wiIHx8XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJERVNDXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJBU0NcIlxuICAgICAgICAgICAgICAgIGxldCBudWxscyA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvcmRlcltrZXldID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChvcmRlcltrZXldIGFzIGFueSkubnVsbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgbnVsbHMgPVxuICAgICAgICAgICAgICAgICAgICBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJmaXJzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiTlVMTFMgRklSU1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICAgICAgICBsZXQgYWxpYXNQYXRoID0gYCR7YWxpYXN9LiR7cHJvcGVydHlQYXRofWBcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbFByb3BlcnR5ICYmIGNvbHVtbi5xdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuc2VsZWN0aW9uID09PSBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbGlhc05hbWUgPSBhbGlhc1BhdGhcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoYWxpYXMpfSlgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9yZGVyQnkoYWxpYXNQYXRoLCBkaXJlY3Rpb24sIG51bGxzKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBqb2luQWxpYXMgPSBhbGlhcyArIFwiX1wiICsgcHJvcGVydHlQYXRoLnJlcGxhY2UoXCIuXCIsIFwiX1wiKVxuICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChqb2luKSA9PiBqb2luLmFsaWFzID09PSBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkV2hlcmUoXG4gICAgICAgIHdoZXJlOiBGaW5kT3B0aW9uc1doZXJlPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGxldCBjb25kaXRpb246IHN0cmluZyA9IFwiXCJcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aGVyZSkpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgXCIoXCIgK1xuICAgICAgICAgICAgICAgIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHdoZXJlSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRQcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbmRpdGlvbikgPT4gISFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbmRpdGlvbikgPT4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIilcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgT1IgXCIpICtcbiAgICAgICAgICAgICAgICBcIilcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFuZENvbmRpdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB3aGVyZSkge1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZVtrZXldID09PSB1bmRlZmluZWQgfHwgd2hlcmVba2V5XSA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZCA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG5cbiAgICAgICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBgKCR7Y29sdW1uLnF1ZXJ5KGFsaWFzKX0pYFxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IHdoZXJlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKEluc3RhbmNlQ2hlY2tlci5pc0VxdWFsT3BlcmF0b3Iod2hlcmVba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gd2hlcmVba2V5XS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gQXBwbHlWYWx1ZVRyYW5zZm9ybWVycy50cmFuc2Zvcm1UbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHJhbnNmb3JtZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgICBhbmRDb25kaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFdoZXJlUHJlZGljYXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgIClcblxuXG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlW2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtrZXldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxBbGxVbmRlZmluZWQgPSBPYmplY3Qua2V5cyh3aGVyZVtrZXldKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaykgPT4gd2hlcmVba2V5XVtrXSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbEFsbFVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSW5zdGFuY2VDaGVja2VyLmlzRmluZE9wZXJhdG9yKHdoZXJlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XS50eXBlID09PSBcIm1vcmVUaGFuXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibGVzc1RoYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibW9yZVRoYW5cIiA/IFwiPlwiIDogXCI8XCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFiOiBRdWVyeUJ1aWxkZXI8YW55PiA9IHRoaXMuc3ViUXVlcnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb01hbnlPd25lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYi5zZWxlY3QoXCJDT1VOVCgqKVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uam9pblRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzTWFueVRvTWFueU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLnNlbGVjdChcIkNPVU5UKCopXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLmpvaW5UYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uIS5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlUmVsYXRpb24hLmludmVyc2VKb2luQ29sdW1ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pblRhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSAke2FsaWFzfS4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuc2VsZWN0KFwiQ09VTlQoKilcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyByZWxhdGlvbiBpc24ndCBzdXBwb3J0ZWQgYnkgZ2l2ZW4gZmluZCBvcGVyYXRvcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuZ2V0U3FsKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsT3BlcmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQod2hlcmVba2V5XS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmlzTWFueVRvT25lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGlvbi5pc09uZVRvT25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kQ29uZGl0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVXaGVyZUNvbmRpdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgcmVsYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IGdpdmVuIGZpbmQgb3BlcmF0b3JgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RKb2luLnR5cGUgPT09IFwibGVmdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdEpvaW4udHlwZSA9IFwiaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLmJ1aWxkV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGFuZENvbmRpdGlvbnMuam9pbihcIiBBTkQgXCIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxuICAgIH1cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRhb24tdHlwZW9ybSBsaWIvdHlwZW9ybS9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlci50cyJdfQ==
|